diff --git a/packages/google-cloud-compute/google/cloud/compute/gapic_version.py b/packages/google-cloud-compute/google/cloud/compute/gapic_version.py index 45f4e360312c..558c8aab67c5 100644 --- a/packages/google-cloud-compute/google/cloud/compute/gapic_version.py +++ b/packages/google-cloud-compute/google/cloud/compute/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.24.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py index 45f4e360312c..558c8aab67c5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.24.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/client.py index ac106837c853..d39ffd72fb10 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/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-compute/google/cloud/compute_v1/services/accelerator_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/transports/rest.py index f693a068f350..c0567852cacd 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/accelerator_types/transports/rest.py @@ -118,12 +118,37 @@ def post_aggregated_list( ) -> compute.AcceleratorTypeAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AcceleratorTypes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.AcceleratorTypeAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.AcceleratorTypeAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AcceleratorTypes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetAcceleratorTypeRequest, @@ -141,12 +166,35 @@ def pre_get( def post_get(self, response: compute.AcceleratorType) -> compute.AcceleratorType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AcceleratorTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.AcceleratorType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AcceleratorType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AcceleratorTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListAcceleratorTypesRequest, @@ -166,12 +214,35 @@ def post_list( ) -> compute.AcceleratorTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the AcceleratorTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.AcceleratorTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AcceleratorTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the AcceleratorTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AcceleratorTypesRestStub: @@ -384,6 +455,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -538,6 +613,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -682,6 +759,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py index d3d71b3a0315..e4a92f99f398 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/addresses/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py index 88cc27b706b7..c51883d07134 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/addresses/transports/rest.py @@ -149,12 +149,35 @@ def post_aggregated_list( ) -> compute.AddressAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.AddressAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AddressAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteAddressRequest, @@ -170,12 +193,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetAddressRequest, @@ -191,12 +237,35 @@ def pre_get( def post_get(self, response: compute.Address) -> compute.Address: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Address, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Address, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertAddressRequest, @@ -212,12 +281,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListAddressesRequest, @@ -233,12 +325,35 @@ def pre_list( def post_list(self, response: compute.AddressList) -> compute.AddressList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.AddressList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AddressList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_move( self, request: compute.MoveAddressRequest, @@ -254,12 +369,35 @@ def pre_move( def post_move(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for move - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Addresses server but before - it is returned to user code. + it is returned to user code. This `post_move` interceptor runs + before the `post_move_with_metadata` interceptor. """ return response + def post_move_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Addresses server but before it is returned to user code. + + We recommend only using this `post_move_with_metadata` + interceptor in new development instead of the `post_move` interceptor. + When both interceptors are used, this `post_move_with_metadata` interceptor runs after the + `post_move` interceptor. The (possibly modified) response returned by + `post_move` will be passed to + `post_move_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsAddressRequest, @@ -277,12 +415,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Addresses 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Addresses 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 + @dataclasses.dataclass class AddressesRestStub: @@ -497,6 +658,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -656,6 +821,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -802,6 +971,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -967,6 +1138,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1106,6 +1281,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1268,6 +1445,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1435,6 +1614,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/client.py index c25341b16d1c..3fc709e8bbd0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/autoscalers/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/transports/rest.py index 932152c9df4b..1b05c7b7451e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/autoscalers/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.AutoscalerAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.AutoscalerAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.AutoscalerAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteAutoscalerRequest, @@ -173,12 +198,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetAutoscalerRequest, @@ -194,12 +242,35 @@ def pre_get( def post_get(self, response: compute.Autoscaler) -> compute.Autoscaler: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Autoscaler, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Autoscaler, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertAutoscalerRequest, @@ -217,12 +288,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListAutoscalersRequest, @@ -238,12 +332,35 @@ def pre_list( def post_list(self, response: compute.AutoscalerList) -> compute.AutoscalerList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.AutoscalerList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AutoscalerList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchAutoscalerRequest, @@ -259,12 +376,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateAutoscalerRequest, @@ -282,12 +422,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Autoscalers server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Autoscalers server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class AutoscalersRestStub: @@ -498,6 +661,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -659,6 +826,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -813,6 +984,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -978,6 +1151,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1122,6 +1299,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1287,6 +1466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1452,6 +1635,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/client.py index 9a8da0fe724f..a7c1a4e86d66 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/backend_buckets/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/transports/rest.py index 99593985513e..3f75b5ec3c39 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_buckets/transports/rest.py @@ -188,12 +188,35 @@ def pre_add_signed_url_key( def post_add_signed_url_key(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_signed_url_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_signed_url_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_add_signed_url_key` interceptor runs + before the `post_add_signed_url_key_with_metadata` interceptor. """ return response + def post_add_signed_url_key_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_signed_url_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_add_signed_url_key_with_metadata` + interceptor in new development instead of the `post_add_signed_url_key` interceptor. + When both interceptors are used, this `post_add_signed_url_key_with_metadata` interceptor runs after the + `post_add_signed_url_key` interceptor. The (possibly modified) response returned by + `post_add_signed_url_key` will be passed to + `post_add_signed_url_key_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteBackendBucketRequest, @@ -211,12 +234,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_signed_url_key( self, request: compute.DeleteSignedUrlKeyBackendBucketRequest, @@ -237,12 +283,35 @@ def post_delete_signed_url_key( ) -> compute.Operation: """Post-rpc interceptor for delete_signed_url_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_signed_url_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_delete_signed_url_key` interceptor runs + before the `post_delete_signed_url_key_with_metadata` interceptor. """ return response + def post_delete_signed_url_key_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_signed_url_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_delete_signed_url_key_with_metadata` + interceptor in new development instead of the `post_delete_signed_url_key` interceptor. + When both interceptors are used, this `post_delete_signed_url_key_with_metadata` interceptor runs after the + `post_delete_signed_url_key` interceptor. The (possibly modified) response returned by + `post_delete_signed_url_key` will be passed to + `post_delete_signed_url_key_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetBackendBucketRequest, @@ -260,12 +329,35 @@ def pre_get( def post_get(self, response: compute.BackendBucket) -> compute.BackendBucket: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.BackendBucket, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendBucket, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyBackendBucketRequest, @@ -284,12 +376,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 BackendBuckets 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 BackendBuckets 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_insert( self, request: compute.InsertBackendBucketRequest, @@ -307,12 +422,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListBackendBucketsRequest, @@ -332,12 +470,35 @@ def post_list( ) -> compute.BackendBucketList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.BackendBucketList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendBucketList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchBackendBucketRequest, @@ -355,12 +516,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_edge_security_policy( self, request: compute.SetEdgeSecurityPolicyBackendBucketRequest, @@ -381,12 +565,35 @@ def post_set_edge_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_edge_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_edge_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_set_edge_security_policy` interceptor runs + before the `post_set_edge_security_policy_with_metadata` interceptor. """ return response + def post_set_edge_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_edge_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_set_edge_security_policy_with_metadata` + interceptor in new development instead of the `post_set_edge_security_policy` interceptor. + When both interceptors are used, this `post_set_edge_security_policy_with_metadata` interceptor runs after the + `post_set_edge_security_policy` interceptor. The (possibly modified) response returned by + `post_set_edge_security_policy` will be passed to + `post_set_edge_security_policy_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyBackendBucketRequest, @@ -405,12 +612,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 BackendBuckets 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 BackendBuckets 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: compute.TestIamPermissionsBackendBucketRequest, @@ -431,12 +661,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 BackendBuckets 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 BackendBuckets 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( self, request: compute.UpdateBackendBucketRequest, @@ -454,12 +709,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendBuckets server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendBuckets server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class BackendBucketsRestStub: @@ -695,6 +973,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_signed_url_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_signed_url_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -856,6 +1138,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1017,6 +1303,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_signed_url_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_signed_url_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1164,6 +1454,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1329,6 +1621,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 @@ -1496,6 +1792,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1642,6 +1942,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1809,6 +2111,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1977,6 +2283,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_edge_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_edge_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2148,6 +2458,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 @@ -2298,6 +2612,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 @@ -2465,6 +2783,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/client.py index 893247fe95e3..181824efffae 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/backend_services/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/transports/rest.py index 6ea2df45b005..551770013065 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/backend_services/transports/rest.py @@ -220,12 +220,35 @@ def pre_add_signed_url_key( def post_add_signed_url_key(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_signed_url_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_signed_url_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_add_signed_url_key` interceptor runs + before the `post_add_signed_url_key_with_metadata` interceptor. """ return response + def post_add_signed_url_key_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_signed_url_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_add_signed_url_key_with_metadata` + interceptor in new development instead of the `post_add_signed_url_key` interceptor. + When both interceptors are used, this `post_add_signed_url_key_with_metadata` interceptor runs after the + `post_add_signed_url_key` interceptor. The (possibly modified) response returned by + `post_add_signed_url_key` will be passed to + `post_add_signed_url_key_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListBackendServicesRequest, @@ -246,12 +269,37 @@ def post_aggregated_list( ) -> compute.BackendServiceAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.BackendServiceAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.BackendServiceAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteBackendServiceRequest, @@ -269,12 +317,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_signed_url_key( self, request: compute.DeleteSignedUrlKeyBackendServiceRequest, @@ -295,12 +366,35 @@ def post_delete_signed_url_key( ) -> compute.Operation: """Post-rpc interceptor for delete_signed_url_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_signed_url_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_delete_signed_url_key` interceptor runs + before the `post_delete_signed_url_key_with_metadata` interceptor. """ return response + def post_delete_signed_url_key_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_signed_url_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_delete_signed_url_key_with_metadata` + interceptor in new development instead of the `post_delete_signed_url_key` interceptor. + When both interceptors are used, this `post_delete_signed_url_key_with_metadata` interceptor runs after the + `post_delete_signed_url_key` interceptor. The (possibly modified) response returned by + `post_delete_signed_url_key` will be passed to + `post_delete_signed_url_key_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetBackendServiceRequest, @@ -318,12 +412,35 @@ def pre_get( def post_get(self, response: compute.BackendService) -> compute.BackendService: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.BackendService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendService, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_health( self, request: compute.GetHealthBackendServiceRequest, @@ -343,12 +460,37 @@ def post_get_health( ) -> compute.BackendServiceGroupHealth: """Post-rpc interceptor for get_health - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_health_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_get_health` interceptor runs + before the `post_get_health_with_metadata` interceptor. """ return response + def post_get_health_with_metadata( + self, + response: compute.BackendServiceGroupHealth, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.BackendServiceGroupHealth, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_health + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_get_health_with_metadata` + interceptor in new development instead of the `post_get_health` interceptor. + When both interceptors are used, this `post_get_health_with_metadata` interceptor runs after the + `post_get_health` interceptor. The (possibly modified) response returned by + `post_get_health` will be passed to + `post_get_health_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyBackendServiceRequest, @@ -367,12 +509,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 BackendServices 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 BackendServices 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_insert( self, request: compute.InsertBackendServiceRequest, @@ -390,12 +555,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListBackendServicesRequest, @@ -415,12 +603,35 @@ def post_list( ) -> compute.BackendServiceList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.BackendServiceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendServiceList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_usable( self, request: compute.ListUsableBackendServicesRequest, @@ -441,12 +652,37 @@ def post_list_usable( ) -> compute.BackendServiceListUsable: """Post-rpc interceptor for list_usable - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_usable_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_list_usable` interceptor runs + before the `post_list_usable_with_metadata` interceptor. """ return response + def post_list_usable_with_metadata( + self, + response: compute.BackendServiceListUsable, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.BackendServiceListUsable, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_usable + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_list_usable_with_metadata` + interceptor in new development instead of the `post_list_usable` interceptor. + When both interceptors are used, this `post_list_usable_with_metadata` interceptor runs after the + `post_list_usable` interceptor. The (possibly modified) response returned by + `post_list_usable` will be passed to + `post_list_usable_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchBackendServiceRequest, @@ -464,12 +700,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_edge_security_policy( self, request: compute.SetEdgeSecurityPolicyBackendServiceRequest, @@ -490,12 +749,35 @@ def post_set_edge_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_edge_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_edge_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_set_edge_security_policy` interceptor runs + before the `post_set_edge_security_policy_with_metadata` interceptor. """ return response + def post_set_edge_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_edge_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_set_edge_security_policy_with_metadata` + interceptor in new development instead of the `post_set_edge_security_policy` interceptor. + When both interceptors are used, this `post_set_edge_security_policy_with_metadata` interceptor runs after the + `post_set_edge_security_policy` interceptor. The (possibly modified) response returned by + `post_set_edge_security_policy` will be passed to + `post_set_edge_security_policy_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyBackendServiceRequest, @@ -514,12 +796,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 BackendServices 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 BackendServices 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_set_security_policy( self, request: compute.SetSecurityPolicyBackendServiceRequest, @@ -540,12 +845,35 @@ def post_set_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_set_security_policy` interceptor runs + before the `post_set_security_policy_with_metadata` interceptor. """ return response + def post_set_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_set_security_policy_with_metadata` + interceptor in new development instead of the `post_set_security_policy` interceptor. + When both interceptors are used, this `post_set_security_policy_with_metadata` interceptor runs after the + `post_set_security_policy` interceptor. The (possibly modified) response returned by + `post_set_security_policy` will be passed to + `post_set_security_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsBackendServiceRequest, @@ -566,12 +894,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 BackendServices 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 BackendServices 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( self, request: compute.UpdateBackendServiceRequest, @@ -589,12 +942,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the BackendServices server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the BackendServices server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class BackendServicesRestStub: @@ -830,6 +1206,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_signed_url_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_signed_url_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -974,6 +1354,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1139,6 +1523,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1301,6 +1689,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_signed_url_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_signed_url_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1460,6 +1852,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1612,6 +2006,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_health(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_health_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1779,6 +2177,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 @@ -1948,6 +2350,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2094,6 +2500,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2238,6 +2646,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_usable(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_usable_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2407,6 +2819,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2577,6 +2993,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_edge_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_edge_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2748,6 +3168,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 @@ -2916,6 +3340,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3067,6 +3495,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 @@ -3236,6 +3668,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/client.py index 2fe1619a9f90..41a0405c13d0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/disk_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/transports/rest.py index 53e57e51b7dd..1b580c0d105f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/disk_types/transports/rest.py @@ -117,12 +117,35 @@ def post_aggregated_list( ) -> compute.DiskTypeAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiskTypes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.DiskTypeAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskTypeAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiskTypes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetDiskTypeRequest, @@ -138,12 +161,35 @@ def pre_get( def post_get(self, response: compute.DiskType) -> compute.DiskType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiskTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.DiskType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiskTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListDiskTypesRequest, @@ -159,12 +205,35 @@ def pre_list( def post_list(self, response: compute.DiskTypeList) -> compute.DiskTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the DiskTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.DiskTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the DiskTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class DiskTypesRestStub: @@ -379,6 +448,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -529,6 +602,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -668,6 +743,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/client.py index 229f23d3c36c..71d282805f76 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/disks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/transports/rest.py index 02d1acbc36a9..9e494bfdf2e2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/disks/transports/rest.py @@ -237,12 +237,35 @@ def post_add_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for add_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_add_resource_policies` interceptor runs + before the `post_add_resource_policies_with_metadata` interceptor. """ return response + def post_add_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_add_resource_policies_with_metadata` + interceptor in new development instead of the `post_add_resource_policies` interceptor. + When both interceptors are used, this `post_add_resource_policies_with_metadata` interceptor runs after the + `post_add_resource_policies` interceptor. The (possibly modified) response returned by + `post_add_resource_policies` will be passed to + `post_add_resource_policies_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListDisksRequest, @@ -262,12 +285,35 @@ def post_aggregated_list( ) -> compute.DiskAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.DiskAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_bulk_insert( self, request: compute.BulkInsertDiskRequest, @@ -283,12 +329,35 @@ def pre_bulk_insert( def post_bulk_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for bulk_insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_bulk_insert` interceptor runs + before the `post_bulk_insert_with_metadata` interceptor. """ return response + def post_bulk_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_bulk_insert_with_metadata` + interceptor in new development instead of the `post_bulk_insert` interceptor. + When both interceptors are used, this `post_bulk_insert_with_metadata` interceptor runs after the + `post_bulk_insert` interceptor. The (possibly modified) response returned by + `post_bulk_insert` will be passed to + `post_bulk_insert_with_metadata`. + """ + return response, metadata + def pre_create_snapshot( self, request: compute.CreateSnapshotDiskRequest, @@ -306,12 +375,35 @@ def pre_create_snapshot( def post_create_snapshot(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for create_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_create_snapshot` interceptor runs + before the `post_create_snapshot_with_metadata` interceptor. """ return response + def post_create_snapshot_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_create_snapshot_with_metadata` + interceptor in new development instead of the `post_create_snapshot` interceptor. + When both interceptors are used, this `post_create_snapshot_with_metadata` interceptor runs after the + `post_create_snapshot` interceptor. The (possibly modified) response returned by + `post_create_snapshot` will be passed to + `post_create_snapshot_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteDiskRequest, @@ -327,12 +419,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetDiskRequest, @@ -348,12 +463,33 @@ def pre_get( def post_get(self, response: compute.Disk) -> compute.Disk: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, response: compute.Disk, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Disk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyDiskRequest, @@ -371,12 +507,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Disks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Disks 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_insert( self, request: compute.InsertDiskRequest, @@ -392,12 +551,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListDisksRequest, @@ -413,12 +595,35 @@ def pre_list( def post_list(self, response: compute.DiskList) -> compute.DiskList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.DiskList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_remove_resource_policies( self, request: compute.RemoveResourcePoliciesDiskRequest, @@ -439,12 +644,35 @@ def post_remove_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for remove_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_remove_resource_policies` interceptor runs + before the `post_remove_resource_policies_with_metadata` interceptor. """ return response + def post_remove_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_remove_resource_policies_with_metadata` + interceptor in new development instead of the `post_remove_resource_policies` interceptor. + When both interceptors are used, this `post_remove_resource_policies_with_metadata` interceptor runs after the + `post_remove_resource_policies` interceptor. The (possibly modified) response returned by + `post_remove_resource_policies` will be passed to + `post_remove_resource_policies_with_metadata`. + """ + return response, metadata + def pre_resize( self, request: compute.ResizeDiskRequest, @@ -460,12 +688,35 @@ def pre_resize( def post_resize(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_resize` interceptor runs + before the `post_resize_with_metadata` interceptor. """ return response + def post_resize_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_resize_with_metadata` + interceptor in new development instead of the `post_resize` interceptor. + When both interceptors are used, this `post_resize_with_metadata` interceptor runs after the + `post_resize` interceptor. The (possibly modified) response returned by + `post_resize` will be passed to + `post_resize_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyDiskRequest, @@ -483,12 +734,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Disks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Disks 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_set_labels( self, request: compute.SetLabelsDiskRequest, @@ -504,12 +778,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Disks 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Disks 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_start_async_replication( self, request: compute.StartAsyncReplicationDiskRequest, @@ -530,12 +827,35 @@ def post_start_async_replication( ) -> compute.Operation: """Post-rpc interceptor for start_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_start_async_replication` interceptor runs + before the `post_start_async_replication_with_metadata` interceptor. """ return response + def post_start_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_start_async_replication_with_metadata` + interceptor in new development instead of the `post_start_async_replication` interceptor. + When both interceptors are used, this `post_start_async_replication_with_metadata` interceptor runs after the + `post_start_async_replication` interceptor. The (possibly modified) response returned by + `post_start_async_replication` will be passed to + `post_start_async_replication_with_metadata`. + """ + return response, metadata + def pre_stop_async_replication( self, request: compute.StopAsyncReplicationDiskRequest, @@ -555,12 +875,35 @@ def post_stop_async_replication( ) -> compute.Operation: """Post-rpc interceptor for stop_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_stop_async_replication` interceptor runs + before the `post_stop_async_replication_with_metadata` interceptor. """ return response + def post_stop_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_stop_async_replication_with_metadata` + interceptor in new development instead of the `post_stop_async_replication` interceptor. + When both interceptors are used, this `post_stop_async_replication_with_metadata` interceptor runs after the + `post_stop_async_replication` interceptor. The (possibly modified) response returned by + `post_stop_async_replication` will be passed to + `post_stop_async_replication_with_metadata`. + """ + return response, metadata + def pre_stop_group_async_replication( self, request: compute.StopGroupAsyncReplicationDiskRequest, @@ -581,12 +924,35 @@ def post_stop_group_async_replication( ) -> compute.Operation: """Post-rpc interceptor for stop_group_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_group_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_stop_group_async_replication` interceptor runs + before the `post_stop_group_async_replication_with_metadata` interceptor. """ return response + def post_stop_group_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_group_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_stop_group_async_replication_with_metadata` + interceptor in new development instead of the `post_stop_group_async_replication` interceptor. + When both interceptors are used, this `post_stop_group_async_replication_with_metadata` interceptor runs after the + `post_stop_group_async_replication` interceptor. The (possibly modified) response returned by + `post_stop_group_async_replication` will be passed to + `post_stop_group_async_replication_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsDiskRequest, @@ -606,12 +972,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Disks 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Disks 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( self, request: compute.UpdateDiskRequest, @@ -627,12 +1018,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Disks server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Disks server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class DisksRestStub: @@ -872,6 +1286,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1016,6 +1434,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1181,6 +1603,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1348,6 +1774,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1504,6 +1934,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1655,6 +2089,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1820,6 +2256,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 @@ -1982,6 +2422,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2121,6 +2565,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2288,6 +2734,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2450,6 +2900,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2621,6 +3075,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 @@ -2786,6 +3244,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 @@ -2953,6 +3415,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3114,6 +3580,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3282,6 +3752,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_group_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_group_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3438,6 +3912,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 @@ -3600,6 +4078,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/client.py index fca2b661f1f1..2e20c7163db4 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/external_vpn_gateways/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/transports/rest.py index b3daa948e7ae..16ab9a34ed50 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/external_vpn_gateways/transports/rest.py @@ -139,12 +139,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ExternalVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ExternalVpnGateways server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetExternalVpnGatewayRequest, @@ -164,12 +187,35 @@ def post_get( ) -> compute.ExternalVpnGateway: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ExternalVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ExternalVpnGateway, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ExternalVpnGateway, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ExternalVpnGateways server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertExternalVpnGatewayRequest, @@ -187,12 +233,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ExternalVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ExternalVpnGateways server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListExternalVpnGatewaysRequest, @@ -212,12 +281,35 @@ def post_list( ) -> compute.ExternalVpnGatewayList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ExternalVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ExternalVpnGatewayList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ExternalVpnGatewayList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ExternalVpnGateways server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsExternalVpnGatewayRequest, @@ -236,12 +328,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 ExternalVpnGateways 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ExternalVpnGateways 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_test_iam_permissions( self, request: compute.TestIamPermissionsExternalVpnGatewayRequest, @@ -262,12 +377,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 ExternalVpnGateways 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 ExternalVpnGateways 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 ExternalVpnGatewaysRestStub: @@ -495,6 +635,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -655,6 +799,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -820,6 +966,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -968,6 +1118,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1134,6 +1286,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 @@ -1287,6 +1443,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-compute/google/cloud/compute_v1/services/firewall_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/client.py index 8da708b9a75a..7ebd4d73b93c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/firewall_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/transports/rest.py index 2ae3c7e45643..f001e71cd932 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewall_policies/transports/rest.py @@ -236,12 +236,35 @@ def pre_add_association( def post_add_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_association` interceptor runs + before the `post_add_association_with_metadata` interceptor. """ return response + def post_add_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_association_with_metadata` + interceptor in new development instead of the `post_add_association` interceptor. + When both interceptors are used, this `post_add_association_with_metadata` interceptor runs after the + `post_add_association` interceptor. The (possibly modified) response returned by + `post_add_association` will be passed to + `post_add_association_with_metadata`. + """ + return response, metadata + def pre_add_rule( self, request: compute.AddRuleFirewallPolicyRequest, @@ -259,12 +282,35 @@ def pre_add_rule( def post_add_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_rule` interceptor runs + before the `post_add_rule_with_metadata` interceptor. """ return response + def post_add_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_rule_with_metadata` + interceptor in new development instead of the `post_add_rule` interceptor. + When both interceptors are used, this `post_add_rule_with_metadata` interceptor runs after the + `post_add_rule` interceptor. The (possibly modified) response returned by + `post_add_rule` will be passed to + `post_add_rule_with_metadata`. + """ + return response, metadata + def pre_clone_rules( self, request: compute.CloneRulesFirewallPolicyRequest, @@ -282,12 +328,35 @@ def pre_clone_rules( def post_clone_rules(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for clone_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_clone_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_clone_rules` interceptor runs + before the `post_clone_rules_with_metadata` interceptor. """ return response + def post_clone_rules_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for clone_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_clone_rules_with_metadata` + interceptor in new development instead of the `post_clone_rules` interceptor. + When both interceptors are used, this `post_clone_rules_with_metadata` interceptor runs after the + `post_clone_rules` interceptor. The (possibly modified) response returned by + `post_clone_rules` will be passed to + `post_clone_rules_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteFirewallPolicyRequest, @@ -305,12 +374,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetFirewallPolicyRequest, @@ -328,12 +420,35 @@ def pre_get( def post_get(self, response: compute.FirewallPolicy) -> compute.FirewallPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.FirewallPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_association( self, request: compute.GetAssociationFirewallPolicyRequest, @@ -354,12 +469,37 @@ def post_get_association( ) -> compute.FirewallPolicyAssociation: """Post-rpc interceptor for get_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_association` interceptor runs + before the `post_get_association_with_metadata` interceptor. """ return response + def post_get_association_with_metadata( + self, + response: compute.FirewallPolicyAssociation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.FirewallPolicyAssociation, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_association_with_metadata` + interceptor in new development instead of the `post_get_association` interceptor. + When both interceptors are used, this `post_get_association_with_metadata` interceptor runs after the + `post_get_association` interceptor. The (possibly modified) response returned by + `post_get_association` will be passed to + `post_get_association_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyFirewallPolicyRequest, @@ -378,12 +518,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 FirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 FirewallPolicies 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_rule( self, request: compute.GetRuleFirewallPolicyRequest, @@ -403,12 +566,35 @@ def post_get_rule( ) -> compute.FirewallPolicyRule: """Post-rpc interceptor for get_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_rule` interceptor runs + before the `post_get_rule_with_metadata` interceptor. """ return response + def post_get_rule_with_metadata( + self, + response: compute.FirewallPolicyRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_rule_with_metadata` + interceptor in new development instead of the `post_get_rule` interceptor. + When both interceptors are used, this `post_get_rule_with_metadata` interceptor runs after the + `post_get_rule` interceptor. The (possibly modified) response returned by + `post_get_rule` will be passed to + `post_get_rule_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertFirewallPolicyRequest, @@ -426,12 +612,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListFirewallPoliciesRequest, @@ -451,12 +660,35 @@ def post_list( ) -> compute.FirewallPolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.FirewallPolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_associations( self, request: compute.ListAssociationsFirewallPolicyRequest, @@ -477,12 +709,38 @@ def post_list_associations( ) -> compute.FirewallPoliciesListAssociationsResponse: """Post-rpc interceptor for list_associations - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_associations_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list_associations` interceptor runs + before the `post_list_associations_with_metadata` interceptor. """ return response + def post_list_associations_with_metadata( + self, + response: compute.FirewallPoliciesListAssociationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.FirewallPoliciesListAssociationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_associations + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_list_associations_with_metadata` + interceptor in new development instead of the `post_list_associations` interceptor. + When both interceptors are used, this `post_list_associations_with_metadata` interceptor runs after the + `post_list_associations` interceptor. The (possibly modified) response returned by + `post_list_associations` will be passed to + `post_list_associations_with_metadata`. + """ + return response, metadata + def pre_move( self, request: compute.MoveFirewallPolicyRequest, @@ -500,12 +758,35 @@ def pre_move( def post_move(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for move - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_move` interceptor runs + before the `post_move_with_metadata` interceptor. """ return response + def post_move_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_move_with_metadata` + interceptor in new development instead of the `post_move` interceptor. + When both interceptors are used, this `post_move_with_metadata` interceptor runs after the + `post_move` interceptor. The (possibly modified) response returned by + `post_move` will be passed to + `post_move_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchFirewallPolicyRequest, @@ -523,12 +804,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_rule( self, request: compute.PatchRuleFirewallPolicyRequest, @@ -546,12 +850,35 @@ def pre_patch_rule( def post_patch_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch_rule` interceptor runs + before the `post_patch_rule_with_metadata` interceptor. """ return response + def post_patch_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_rule_with_metadata` + interceptor in new development instead of the `post_patch_rule` interceptor. + When both interceptors are used, this `post_patch_rule_with_metadata` interceptor runs after the + `post_patch_rule` interceptor. The (possibly modified) response returned by + `post_patch_rule` will be passed to + `post_patch_rule_with_metadata`. + """ + return response, metadata + def pre_remove_association( self, request: compute.RemoveAssociationFirewallPolicyRequest, @@ -570,12 +897,35 @@ def pre_remove_association( def post_remove_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_association` interceptor runs + before the `post_remove_association_with_metadata` interceptor. """ return response + def post_remove_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_association_with_metadata` + interceptor in new development instead of the `post_remove_association` interceptor. + When both interceptors are used, this `post_remove_association_with_metadata` interceptor runs after the + `post_remove_association` interceptor. The (possibly modified) response returned by + `post_remove_association` will be passed to + `post_remove_association_with_metadata`. + """ + return response, metadata + def pre_remove_rule( self, request: compute.RemoveRuleFirewallPolicyRequest, @@ -593,12 +943,35 @@ def pre_remove_rule( def post_remove_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the FirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_rule` interceptor runs + before the `post_remove_rule_with_metadata` interceptor. """ return response + def post_remove_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the FirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_rule_with_metadata` + interceptor in new development instead of the `post_remove_rule` interceptor. + When both interceptors are used, this `post_remove_rule_with_metadata` interceptor runs after the + `post_remove_rule` interceptor. The (possibly modified) response returned by + `post_remove_rule` will be passed to + `post_remove_rule_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyFirewallPolicyRequest, @@ -617,12 +990,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 FirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 FirewallPolicies 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: compute.TestIamPermissionsFirewallPolicyRequest, @@ -643,12 +1039,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 FirewallPolicies 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 FirewallPolicies 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 FirewallPoliciesRestStub: @@ -882,6 +1303,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1053,6 +1478,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1212,6 +1641,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_clone_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_clone_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1375,6 +1808,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1521,6 +1958,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1663,6 +2102,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1830,6 +2273,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 @@ -1980,6 +2427,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2151,6 +2602,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2295,6 +2750,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2440,6 +2897,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_associations(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_associations_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2605,6 +3066,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2774,6 +3237,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2939,6 +3406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3101,6 +3572,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3260,6 +3735,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3431,6 +3910,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 @@ -3582,6 +4065,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-compute/google/cloud/compute_v1/services/firewalls/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/client.py index 0de4cdc1a12d..295677f5f50e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/firewalls/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/transports/rest.py index 896cd8868490..7732be07c506 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/firewalls/transports/rest.py @@ -137,12 +137,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetFirewallRequest, @@ -158,12 +181,35 @@ def pre_get( def post_get(self, response: compute.Firewall) -> compute.Firewall: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Firewall, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Firewall, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertFirewallRequest, @@ -179,12 +225,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListFirewallsRequest, @@ -200,12 +269,35 @@ def pre_list( def post_list(self, response: compute.FirewallList) -> compute.FirewallList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.FirewallList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchFirewallRequest, @@ -221,12 +313,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateFirewallRequest, @@ -242,12 +357,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Firewalls server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Firewalls server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class FirewallsRestStub: @@ -475,6 +613,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -619,6 +761,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -784,6 +928,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -923,6 +1071,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1088,6 +1238,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1253,6 +1407,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/client.py index bce45cef30fc..f8560124eafe 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/forwarding_rules/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/transports/rest.py index a7794aac8401..b29d4e0565d8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/forwarding_rules/transports/rest.py @@ -158,12 +158,37 @@ def post_aggregated_list( ) -> compute.ForwardingRuleAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.ForwardingRuleAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ForwardingRuleAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteForwardingRuleRequest, @@ -181,12 +206,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetForwardingRuleRequest, @@ -204,12 +252,35 @@ def pre_get( def post_get(self, response: compute.ForwardingRule) -> compute.ForwardingRule: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ForwardingRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ForwardingRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertForwardingRuleRequest, @@ -227,12 +298,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListForwardingRulesRequest, @@ -252,12 +346,35 @@ def post_list( ) -> compute.ForwardingRuleList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ForwardingRuleList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ForwardingRuleList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchForwardingRuleRequest, @@ -275,12 +392,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsForwardingRuleRequest, @@ -298,12 +438,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 ForwardingRules 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ForwardingRules 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_target( self, request: compute.SetTargetForwardingRuleRequest, @@ -321,12 +484,35 @@ def pre_set_target( def post_set_target(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_target - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_target_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_set_target` interceptor runs + before the `post_set_target_with_metadata` interceptor. """ return response + def post_set_target_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_target + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ForwardingRules server but before it is returned to user code. + + We recommend only using this `post_set_target_with_metadata` + interceptor in new development instead of the `post_set_target` interceptor. + When both interceptors are used, this `post_set_target_with_metadata` interceptor runs after the + `post_set_target` interceptor. The (possibly modified) response returned by + `post_set_target` will be passed to + `post_set_target_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ForwardingRulesRestStub: @@ -537,6 +723,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -702,6 +892,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -858,6 +1052,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1027,6 +1223,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1173,6 +1373,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1340,6 +1542,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1509,6 +1715,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 @@ -1678,6 +1888,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_target(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_target_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py index 2fcf027c8bec..b0cd83d9d1c6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py index d2110ebc0102..08e7c76ac995 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_addresses/transports/rest.py @@ -139,12 +139,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalAddresses server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalAddressRequest, @@ -162,12 +185,35 @@ def pre_get( def post_get(self, response: compute.Address) -> compute.Address: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalAddresses server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Address, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Address, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertGlobalAddressRequest, @@ -185,12 +231,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalAddresses server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalAddressesRequest, @@ -208,12 +277,35 @@ def pre_list( def post_list(self, response: compute.AddressList) -> compute.AddressList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalAddresses server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.AddressList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.AddressList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_move( self, request: compute.MoveGlobalAddressRequest, @@ -231,12 +323,35 @@ def pre_move( def post_move(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for move - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalAddresses server but before - it is returned to user code. + it is returned to user code. This `post_move` interceptor runs + before the `post_move_with_metadata` interceptor. """ return response + def post_move_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalAddresses server but before it is returned to user code. + + We recommend only using this `post_move_with_metadata` + interceptor in new development instead of the `post_move` interceptor. + When both interceptors are used, this `post_move_with_metadata` interceptor runs after the + `post_move` interceptor. The (possibly modified) response returned by + `post_move` will be passed to + `post_move_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsGlobalAddressRequest, @@ -254,12 +369,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 GlobalAddresses 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 GlobalAddresses 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 + @dataclasses.dataclass class GlobalAddressesRestStub: @@ -491,6 +629,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -642,6 +784,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -811,6 +955,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -955,6 +1103,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1122,6 +1272,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1291,6 +1443,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/client.py index f950a5a25378..7fb8babb8113 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/global_forwarding_rules/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/transports/rest.py index ae74b87b2e59..090695c9737c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_forwarding_rules/transports/rest.py @@ -148,12 +148,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalForwardingRuleRequest, @@ -171,12 +194,35 @@ def pre_get( def post_get(self, response: compute.ForwardingRule) -> compute.ForwardingRule: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ForwardingRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ForwardingRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertGlobalForwardingRuleRequest, @@ -195,12 +241,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalForwardingRulesRequest, @@ -221,12 +290,35 @@ def post_list( ) -> compute.ForwardingRuleList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ForwardingRuleList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ForwardingRuleList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchGlobalForwardingRuleRequest, @@ -245,12 +337,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsGlobalForwardingRuleRequest, @@ -269,12 +384,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 GlobalForwardingRules 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 GlobalForwardingRules 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_target( self, request: compute.SetTargetGlobalForwardingRuleRequest, @@ -293,12 +431,35 @@ def pre_set_target( def post_set_target(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_target - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_target_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalForwardingRules server but before - it is returned to user code. + it is returned to user code. This `post_set_target` interceptor runs + before the `post_set_target_with_metadata` interceptor. """ return response + def post_set_target_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_target + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalForwardingRules server but before it is returned to user code. + + We recommend only using this `post_set_target_with_metadata` + interceptor in new development instead of the `post_set_target` interceptor. + When both interceptors are used, this `post_set_target_with_metadata` interceptor runs after the + `post_set_target` interceptor. The (possibly modified) response returned by + `post_set_target` will be passed to + `post_set_target_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalForwardingRulesRestStub: @@ -527,6 +688,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -683,6 +848,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -849,6 +1016,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -993,6 +1164,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1159,6 +1332,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1325,6 +1502,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 @@ -1491,6 +1672,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_target(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_target_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/client.py index 097c349490a8..544514932029 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/transports/rest.py index e9b4dfd2770f..55e613cc1bab 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_network_endpoint_groups/transports/rest.py @@ -150,12 +150,35 @@ def post_attach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for attach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_attach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_attach_network_endpoints` interceptor runs + before the `post_attach_network_endpoints_with_metadata` interceptor. """ return response + def post_attach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for attach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_attach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_attach_network_endpoints` interceptor. + When both interceptors are used, this `post_attach_network_endpoints_with_metadata` interceptor runs after the + `post_attach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_attach_network_endpoints` will be passed to + `post_attach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteGlobalNetworkEndpointGroupRequest, @@ -174,12 +197,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_detach_network_endpoints( self, request: compute.DetachNetworkEndpointsGlobalNetworkEndpointGroupRequest, @@ -200,12 +246,35 @@ def post_detach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for detach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_detach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_detach_network_endpoints` interceptor runs + before the `post_detach_network_endpoints_with_metadata` interceptor. """ return response + def post_detach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for detach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_detach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_detach_network_endpoints` interceptor. + When both interceptors are used, this `post_detach_network_endpoints_with_metadata` interceptor runs after the + `post_detach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_detach_network_endpoints` will be passed to + `post_detach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalNetworkEndpointGroupRequest, @@ -226,12 +295,35 @@ def post_get( ) -> compute.NetworkEndpointGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkEndpointGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkEndpointGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertGlobalNetworkEndpointGroupRequest, @@ -250,12 +342,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalNetworkEndpointGroupsRequest, @@ -276,12 +391,37 @@ def post_list( ) -> compute.NetworkEndpointGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkEndpointGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_network_endpoints( self, request: compute.ListNetworkEndpointsGlobalNetworkEndpointGroupsRequest, @@ -302,12 +442,38 @@ def post_list_network_endpoints( ) -> compute.NetworkEndpointGroupsListNetworkEndpoints: """Post-rpc interceptor for list_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list_network_endpoints` interceptor runs + before the `post_list_network_endpoints_with_metadata` interceptor. """ return response + def post_list_network_endpoints_with_metadata( + self, + response: compute.NetworkEndpointGroupsListNetworkEndpoints, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupsListNetworkEndpoints, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_network_endpoints_with_metadata` + interceptor in new development instead of the `post_list_network_endpoints` interceptor. + When both interceptors are used, this `post_list_network_endpoints_with_metadata` interceptor runs after the + `post_list_network_endpoints` interceptor. The (possibly modified) response returned by + `post_list_network_endpoints` will be passed to + `post_list_network_endpoints_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalNetworkEndpointGroupsRestStub: @@ -548,6 +714,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_attach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_attach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -708,6 +878,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -878,6 +1052,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_detach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_detach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1029,6 +1207,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1195,6 +1375,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1338,6 +1522,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1485,6 +1671,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/client.py index a1223f9a9418..37b2d5b9d914 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/global_operations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/transports/rest.py index f7ca4bae9469..e029431ca2c7 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_operations/transports/rest.py @@ -134,12 +134,37 @@ def post_aggregated_list( ) -> compute.OperationAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOperations server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.OperationAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.OperationAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOperations server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteGlobalOperationRequest, @@ -159,12 +184,37 @@ def post_delete( ) -> compute.DeleteGlobalOperationResponse: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOperations server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.DeleteGlobalOperationResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.DeleteGlobalOperationResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOperations server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalOperationRequest, @@ -182,12 +232,35 @@ def pre_get( def post_get(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOperations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOperations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalOperationsRequest, @@ -205,12 +278,35 @@ def pre_list( def post_list(self, response: compute.OperationList) -> compute.OperationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOperations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.OperationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.OperationList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOperations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_wait( self, request: compute.WaitGlobalOperationRequest, @@ -228,12 +324,35 @@ def pre_wait( def post_wait(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for wait - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_wait_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOperations server but before - it is returned to user code. + it is returned to user code. This `post_wait` interceptor runs + before the `post_wait_with_metadata` interceptor. """ return response + def post_wait_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for wait + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOperations server but before it is returned to user code. + + We recommend only using this `post_wait_with_metadata` + interceptor in new development instead of the `post_wait` interceptor. + When both interceptors are used, this `post_wait_with_metadata` interceptor runs after the + `post_wait` interceptor. The (possibly modified) response returned by + `post_wait` will be passed to + `post_wait_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalOperationsRestStub: @@ -444,6 +563,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -593,6 +716,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -756,6 +883,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -902,6 +1031,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1063,6 +1194,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_wait(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_wait_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/client.py index 9713ec40bd5c..3a5a1431f091 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/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 @@ -462,6 +464,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-compute/google/cloud/compute_v1/services/global_organization_operations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/transports/rest.py index f84931824737..7f3938ac0ac8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_organization_operations/transports/rest.py @@ -118,12 +118,38 @@ def post_delete( ) -> compute.DeleteGlobalOrganizationOperationResponse: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOrganizationOperations server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.DeleteGlobalOrganizationOperationResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.DeleteGlobalOrganizationOperationResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOrganizationOperations server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalOrganizationOperationRequest, @@ -142,12 +168,35 @@ def pre_get( def post_get(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOrganizationOperations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOrganizationOperations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalOrganizationOperationsRequest, @@ -166,12 +215,35 @@ def pre_list( def post_list(self, response: compute.OperationList) -> compute.OperationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalOrganizationOperations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.OperationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.OperationList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalOrganizationOperations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalOrganizationOperationsRestStub: @@ -388,6 +460,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -552,6 +628,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -697,6 +775,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/client.py index a03981a443fb..e0a32a3b3a1d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/transports/rest.py index 12aa802cb36c..c628a54fb6ab 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/global_public_delegated_prefixes/transports/rest.py @@ -132,12 +132,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalPublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalPublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetGlobalPublicDelegatedPrefixeRequest, @@ -158,12 +181,35 @@ def post_get( ) -> compute.PublicDelegatedPrefix: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalPublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.PublicDelegatedPrefix, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.PublicDelegatedPrefix, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalPublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertGlobalPublicDelegatedPrefixeRequest, @@ -182,12 +228,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalPublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalPublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListGlobalPublicDelegatedPrefixesRequest, @@ -208,12 +277,37 @@ def post_list( ) -> compute.PublicDelegatedPrefixList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalPublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.PublicDelegatedPrefixList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.PublicDelegatedPrefixList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalPublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchGlobalPublicDelegatedPrefixeRequest, @@ -232,12 +326,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the GlobalPublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the GlobalPublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class GlobalPublicDelegatedPrefixesRestStub: @@ -470,6 +587,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -622,6 +743,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -788,6 +911,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -931,6 +1058,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1099,6 +1228,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/client.py index 6e2b31ffafba..e5bad572065c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/health_checks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/transports/rest.py index c5f43ca900b5..8a9d050a700f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/health_checks/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.HealthChecksAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.HealthChecksAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.HealthChecksAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteHealthCheckRequest, @@ -173,12 +198,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetHealthCheckRequest, @@ -194,12 +242,35 @@ def pre_get( def post_get(self, response: compute.HealthCheck) -> compute.HealthCheck: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.HealthCheck, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.HealthCheck, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertHealthCheckRequest, @@ -217,12 +288,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListHealthChecksRequest, @@ -240,12 +334,35 @@ def pre_list( def post_list(self, response: compute.HealthCheckList) -> compute.HealthCheckList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.HealthCheckList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.HealthCheckList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchHealthCheckRequest, @@ -263,12 +380,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateHealthCheckRequest, @@ -286,12 +426,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the HealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the HealthChecks server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class HealthChecksRestStub: @@ -502,6 +665,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -665,6 +832,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -824,6 +995,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -991,6 +1164,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1135,6 +1312,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1300,6 +1479,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1467,6 +1650,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/client.py index 9d3f03c0d5ed..bef11367f804 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -457,6 +459,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/transports/rest.py index f7ea98547660..3145d87c883a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/image_family_views/transports/rest.py @@ -99,12 +99,35 @@ def pre_get( def post_get(self, response: compute.ImageFamilyView) -> compute.ImageFamilyView: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ImageFamilyViews server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ImageFamilyView, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ImageFamilyView, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ImageFamilyViews server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ImageFamilyViewsRestStub: @@ -317,6 +340,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/images/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/images/client.py index 9bc48fc557f0..8dddd5b5d633 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/images/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/images/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/images/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/images/transports/rest.py index 98f84f48aa20..51b78e430adb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/images/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/images/transports/rest.py @@ -177,12 +177,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_deprecate( self, request: compute.DeprecateImageRequest, @@ -198,12 +221,35 @@ def pre_deprecate( def post_deprecate(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for deprecate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_deprecate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_deprecate` interceptor runs + before the `post_deprecate_with_metadata` interceptor. """ return response + def post_deprecate_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for deprecate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_deprecate_with_metadata` + interceptor in new development instead of the `post_deprecate` interceptor. + When both interceptors are used, this `post_deprecate_with_metadata` interceptor runs after the + `post_deprecate` interceptor. The (possibly modified) response returned by + `post_deprecate` will be passed to + `post_deprecate_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetImageRequest, @@ -219,12 +265,33 @@ def pre_get( def post_get(self, response: compute.Image) -> compute.Image: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, response: compute.Image, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Image, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_from_family( self, request: compute.GetFromFamilyImageRequest, @@ -242,12 +309,33 @@ def pre_get_from_family( def post_get_from_family(self, response: compute.Image) -> compute.Image: """Post-rpc interceptor for get_from_family - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_from_family_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_get_from_family` interceptor runs + before the `post_get_from_family_with_metadata` interceptor. """ return response + def post_get_from_family_with_metadata( + self, response: compute.Image, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Image, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_from_family + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_get_from_family_with_metadata` + interceptor in new development instead of the `post_get_from_family` interceptor. + When both interceptors are used, this `post_get_from_family_with_metadata` interceptor runs after the + `post_get_from_family` interceptor. The (possibly modified) response returned by + `post_get_from_family` will be passed to + `post_get_from_family_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyImageRequest, @@ -265,12 +353,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Images 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Images 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_insert( self, request: compute.InsertImageRequest, @@ -286,12 +397,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListImagesRequest, @@ -307,12 +441,35 @@ def pre_list( def post_list(self, response: compute.ImageList) -> compute.ImageList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ImageList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ImageList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchImageRequest, @@ -328,12 +485,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Images server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Images server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyImageRequest, @@ -351,12 +531,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Images 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Images 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_set_labels( self, request: compute.SetLabelsImageRequest, @@ -372,12 +575,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Images 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Images 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_test_iam_permissions( self, request: compute.TestIamPermissionsImageRequest, @@ -397,12 +623,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Images 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Images 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 ImagesRestStub: @@ -627,6 +878,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -792,6 +1047,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_deprecate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_deprecate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -935,6 +1194,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1083,6 +1344,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_from_family(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_from_family_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1250,6 +1515,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 @@ -1412,6 +1681,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1551,6 +1824,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1713,6 +1988,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1886,6 +2165,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 @@ -2051,6 +2334,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 @@ -2205,6 +2492,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-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/client.py index c4ae0c53dcdd..6fc9eeef1b30 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -472,6 +474,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-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/transports/rest.py index e1d4ea5d3afc..ee2244239e80 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_manager_resize_requests/transports/rest.py @@ -132,12 +132,35 @@ def pre_cancel( def post_cancel(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for cancel - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_cancel_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagerResizeRequests server but before - it is returned to user code. + it is returned to user code. This `post_cancel` interceptor runs + before the `post_cancel_with_metadata` interceptor. """ return response + def post_cancel_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for cancel + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagerResizeRequests server but before it is returned to user code. + + We recommend only using this `post_cancel_with_metadata` + interceptor in new development instead of the `post_cancel` interceptor. + When both interceptors are used, this `post_cancel_with_metadata` interceptor runs after the + `post_cancel` interceptor. The (possibly modified) response returned by + `post_cancel` will be passed to + `post_cancel_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstanceGroupManagerResizeRequestRequest, @@ -156,12 +179,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagerResizeRequests server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagerResizeRequests server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstanceGroupManagerResizeRequestRequest, @@ -182,12 +228,38 @@ def post_get( ) -> compute.InstanceGroupManagerResizeRequest: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagerResizeRequests server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceGroupManagerResizeRequest, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagerResizeRequest, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagerResizeRequests server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInstanceGroupManagerResizeRequestRequest, @@ -206,12 +278,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagerResizeRequests server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagerResizeRequests server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstanceGroupManagerResizeRequestsRequest, @@ -232,12 +327,38 @@ def post_list( ) -> compute.InstanceGroupManagerResizeRequestsListResponse: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagerResizeRequests server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceGroupManagerResizeRequestsListResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagerResizeRequestsListResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagerResizeRequests server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstanceGroupManagerResizeRequestsRestStub: @@ -472,6 +593,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_cancel(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_cancel_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -634,6 +759,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -787,6 +916,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -957,6 +1088,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1102,6 +1237,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/client.py index f06aca9cd640..202f0edccb47 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/instance_group_managers/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/transports/rest.py index edcde7634684..8a4013387d9f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_group_managers/transports/rest.py @@ -284,12 +284,35 @@ def pre_abandon_instances( def post_abandon_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for abandon_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_abandon_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_abandon_instances` interceptor runs + before the `post_abandon_instances_with_metadata` interceptor. """ return response + def post_abandon_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for abandon_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_abandon_instances_with_metadata` + interceptor in new development instead of the `post_abandon_instances` interceptor. + When both interceptors are used, this `post_abandon_instances_with_metadata` interceptor runs after the + `post_abandon_instances` interceptor. The (possibly modified) response returned by + `post_abandon_instances` will be passed to + `post_abandon_instances_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListInstanceGroupManagersRequest, @@ -310,12 +333,38 @@ def post_aggregated_list( ) -> compute.InstanceGroupManagerAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InstanceGroupManagerAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagerAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_apply_updates_to_instances( self, request: compute.ApplyUpdatesToInstancesInstanceGroupManagerRequest, @@ -336,12 +385,35 @@ def post_apply_updates_to_instances( ) -> compute.Operation: """Post-rpc interceptor for apply_updates_to_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_updates_to_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_apply_updates_to_instances` interceptor runs + before the `post_apply_updates_to_instances_with_metadata` interceptor. """ return response + def post_apply_updates_to_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for apply_updates_to_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_apply_updates_to_instances_with_metadata` + interceptor in new development instead of the `post_apply_updates_to_instances` interceptor. + When both interceptors are used, this `post_apply_updates_to_instances_with_metadata` interceptor runs after the + `post_apply_updates_to_instances` interceptor. The (possibly modified) response returned by + `post_apply_updates_to_instances` will be passed to + `post_apply_updates_to_instances_with_metadata`. + """ + return response, metadata + def pre_create_instances( self, request: compute.CreateInstancesInstanceGroupManagerRequest, @@ -360,12 +432,35 @@ def pre_create_instances( def post_create_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for create_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_create_instances` interceptor runs + before the `post_create_instances_with_metadata` interceptor. """ return response + def post_create_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_create_instances_with_metadata` + interceptor in new development instead of the `post_create_instances` interceptor. + When both interceptors are used, this `post_create_instances_with_metadata` interceptor runs after the + `post_create_instances` interceptor. The (possibly modified) response returned by + `post_create_instances` will be passed to + `post_create_instances_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstanceGroupManagerRequest, @@ -384,12 +479,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_instances( self, request: compute.DeleteInstancesInstanceGroupManagerRequest, @@ -408,12 +526,35 @@ def pre_delete_instances( def post_delete_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete_instances` interceptor runs + before the `post_delete_instances_with_metadata` interceptor. """ return response + def post_delete_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_instances_with_metadata` + interceptor in new development instead of the `post_delete_instances` interceptor. + When both interceptors are used, this `post_delete_instances_with_metadata` interceptor runs after the + `post_delete_instances` interceptor. The (possibly modified) response returned by + `post_delete_instances` will be passed to + `post_delete_instances_with_metadata`. + """ + return response, metadata + def pre_delete_per_instance_configs( self, request: compute.DeletePerInstanceConfigsInstanceGroupManagerRequest, @@ -434,12 +575,35 @@ def post_delete_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for delete_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete_per_instance_configs` interceptor runs + before the `post_delete_per_instance_configs_with_metadata` interceptor. """ return response + def post_delete_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_delete_per_instance_configs` interceptor. + When both interceptors are used, this `post_delete_per_instance_configs_with_metadata` interceptor runs after the + `post_delete_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_delete_per_instance_configs` will be passed to + `post_delete_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstanceGroupManagerRequest, @@ -459,12 +623,35 @@ def post_get( ) -> compute.InstanceGroupManager: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceGroupManager, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceGroupManager, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInstanceGroupManagerRequest, @@ -483,12 +670,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstanceGroupManagersRequest, @@ -509,12 +719,37 @@ def post_list( ) -> compute.InstanceGroupManagerList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceGroupManagerList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagerList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_errors( self, request: compute.ListErrorsInstanceGroupManagersRequest, @@ -535,12 +770,38 @@ def post_list_errors( ) -> compute.InstanceGroupManagersListErrorsResponse: """Post-rpc interceptor for list_errors - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_errors_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_errors` interceptor runs + before the `post_list_errors_with_metadata` interceptor. """ return response + def post_list_errors_with_metadata( + self, + response: compute.InstanceGroupManagersListErrorsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagersListErrorsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_errors + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_errors_with_metadata` + interceptor in new development instead of the `post_list_errors` interceptor. + When both interceptors are used, this `post_list_errors_with_metadata` interceptor runs after the + `post_list_errors` interceptor. The (possibly modified) response returned by + `post_list_errors` will be passed to + `post_list_errors_with_metadata`. + """ + return response, metadata + def pre_list_managed_instances( self, request: compute.ListManagedInstancesInstanceGroupManagersRequest, @@ -561,12 +822,38 @@ def post_list_managed_instances( ) -> compute.InstanceGroupManagersListManagedInstancesResponse: """Post-rpc interceptor for list_managed_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_managed_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_managed_instances` interceptor runs + before the `post_list_managed_instances_with_metadata` interceptor. """ return response + def post_list_managed_instances_with_metadata( + self, + response: compute.InstanceGroupManagersListManagedInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagersListManagedInstancesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_managed_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_managed_instances_with_metadata` + interceptor in new development instead of the `post_list_managed_instances` interceptor. + When both interceptors are used, this `post_list_managed_instances_with_metadata` interceptor runs after the + `post_list_managed_instances` interceptor. The (possibly modified) response returned by + `post_list_managed_instances` will be passed to + `post_list_managed_instances_with_metadata`. + """ + return response, metadata + def pre_list_per_instance_configs( self, request: compute.ListPerInstanceConfigsInstanceGroupManagersRequest, @@ -587,12 +874,38 @@ def post_list_per_instance_configs( ) -> compute.InstanceGroupManagersListPerInstanceConfigsResp: """Post-rpc interceptor for list_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_per_instance_configs` interceptor runs + before the `post_list_per_instance_configs_with_metadata` interceptor. """ return response + def post_list_per_instance_configs_with_metadata( + self, + response: compute.InstanceGroupManagersListPerInstanceConfigsResp, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupManagersListPerInstanceConfigsResp, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_list_per_instance_configs` interceptor. + When both interceptors are used, this `post_list_per_instance_configs_with_metadata` interceptor runs after the + `post_list_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_list_per_instance_configs` will be passed to + `post_list_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchInstanceGroupManagerRequest, @@ -611,12 +924,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_per_instance_configs( self, request: compute.PatchPerInstanceConfigsInstanceGroupManagerRequest, @@ -637,12 +973,35 @@ def post_patch_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for patch_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_patch_per_instance_configs` interceptor runs + before the `post_patch_per_instance_configs_with_metadata` interceptor. """ return response + def post_patch_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_patch_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_patch_per_instance_configs` interceptor. + When both interceptors are used, this `post_patch_per_instance_configs_with_metadata` interceptor runs after the + `post_patch_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_patch_per_instance_configs` will be passed to + `post_patch_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_recreate_instances( self, request: compute.RecreateInstancesInstanceGroupManagerRequest, @@ -661,12 +1020,35 @@ def pre_recreate_instances( def post_recreate_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for recreate_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_recreate_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_recreate_instances` interceptor runs + before the `post_recreate_instances_with_metadata` interceptor. """ return response + def post_recreate_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for recreate_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_recreate_instances_with_metadata` + interceptor in new development instead of the `post_recreate_instances` interceptor. + When both interceptors are used, this `post_recreate_instances_with_metadata` interceptor runs after the + `post_recreate_instances` interceptor. The (possibly modified) response returned by + `post_recreate_instances` will be passed to + `post_recreate_instances_with_metadata`. + """ + return response, metadata + def pre_resize( self, request: compute.ResizeInstanceGroupManagerRequest, @@ -685,12 +1067,35 @@ def pre_resize( def post_resize(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_resize` interceptor runs + before the `post_resize_with_metadata` interceptor. """ return response + def post_resize_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_resize_with_metadata` + interceptor in new development instead of the `post_resize` interceptor. + When both interceptors are used, this `post_resize_with_metadata` interceptor runs after the + `post_resize` interceptor. The (possibly modified) response returned by + `post_resize` will be passed to + `post_resize_with_metadata`. + """ + return response, metadata + def pre_resume_instances( self, request: compute.ResumeInstancesInstanceGroupManagerRequest, @@ -709,12 +1114,35 @@ def pre_resume_instances( def post_resume_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resume_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_resume_instances` interceptor runs + before the `post_resume_instances_with_metadata` interceptor. """ return response + def post_resume_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_resume_instances_with_metadata` + interceptor in new development instead of the `post_resume_instances` interceptor. + When both interceptors are used, this `post_resume_instances_with_metadata` interceptor runs after the + `post_resume_instances` interceptor. The (possibly modified) response returned by + `post_resume_instances` will be passed to + `post_resume_instances_with_metadata`. + """ + return response, metadata + def pre_set_instance_template( self, request: compute.SetInstanceTemplateInstanceGroupManagerRequest, @@ -735,12 +1163,35 @@ def post_set_instance_template( ) -> compute.Operation: """Post-rpc interceptor for set_instance_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_instance_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_set_instance_template` interceptor runs + before the `post_set_instance_template_with_metadata` interceptor. """ return response + def post_set_instance_template_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_instance_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_set_instance_template_with_metadata` + interceptor in new development instead of the `post_set_instance_template` interceptor. + When both interceptors are used, this `post_set_instance_template_with_metadata` interceptor runs after the + `post_set_instance_template` interceptor. The (possibly modified) response returned by + `post_set_instance_template` will be passed to + `post_set_instance_template_with_metadata`. + """ + return response, metadata + def pre_set_target_pools( self, request: compute.SetTargetPoolsInstanceGroupManagerRequest, @@ -759,12 +1210,35 @@ def pre_set_target_pools( def post_set_target_pools(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_target_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_target_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_set_target_pools` interceptor runs + before the `post_set_target_pools_with_metadata` interceptor. """ return response + def post_set_target_pools_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_target_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_set_target_pools_with_metadata` + interceptor in new development instead of the `post_set_target_pools` interceptor. + When both interceptors are used, this `post_set_target_pools_with_metadata` interceptor runs after the + `post_set_target_pools` interceptor. The (possibly modified) response returned by + `post_set_target_pools` will be passed to + `post_set_target_pools_with_metadata`. + """ + return response, metadata + def pre_start_instances( self, request: compute.StartInstancesInstanceGroupManagerRequest, @@ -783,12 +1257,35 @@ def pre_start_instances( def post_start_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for start_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_start_instances` interceptor runs + before the `post_start_instances_with_metadata` interceptor. """ return response + def post_start_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_start_instances_with_metadata` + interceptor in new development instead of the `post_start_instances` interceptor. + When both interceptors are used, this `post_start_instances_with_metadata` interceptor runs after the + `post_start_instances` interceptor. The (possibly modified) response returned by + `post_start_instances` will be passed to + `post_start_instances_with_metadata`. + """ + return response, metadata + def pre_stop_instances( self, request: compute.StopInstancesInstanceGroupManagerRequest, @@ -807,12 +1304,35 @@ def pre_stop_instances( def post_stop_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for stop_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_stop_instances` interceptor runs + before the `post_stop_instances_with_metadata` interceptor. """ return response + def post_stop_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_stop_instances_with_metadata` + interceptor in new development instead of the `post_stop_instances` interceptor. + When both interceptors are used, this `post_stop_instances_with_metadata` interceptor runs after the + `post_stop_instances` interceptor. The (possibly modified) response returned by + `post_stop_instances` will be passed to + `post_stop_instances_with_metadata`. + """ + return response, metadata + def pre_suspend_instances( self, request: compute.SuspendInstancesInstanceGroupManagerRequest, @@ -831,12 +1351,35 @@ def pre_suspend_instances( def post_suspend_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for suspend_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_suspend_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_suspend_instances` interceptor runs + before the `post_suspend_instances_with_metadata` interceptor. """ return response + def post_suspend_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for suspend_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_suspend_instances_with_metadata` + interceptor in new development instead of the `post_suspend_instances` interceptor. + When both interceptors are used, this `post_suspend_instances_with_metadata` interceptor runs after the + `post_suspend_instances` interceptor. The (possibly modified) response returned by + `post_suspend_instances` will be passed to + `post_suspend_instances_with_metadata`. + """ + return response, metadata + def pre_update_per_instance_configs( self, request: compute.UpdatePerInstanceConfigsInstanceGroupManagerRequest, @@ -857,12 +1400,35 @@ def post_update_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for update_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_update_per_instance_configs` interceptor runs + before the `post_update_per_instance_configs_with_metadata` interceptor. """ return response + def post_update_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_update_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_update_per_instance_configs` interceptor. + When both interceptors are used, this `post_update_per_instance_configs_with_metadata` interceptor runs after the + `post_update_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_update_per_instance_configs` will be passed to + `post_update_per_instance_configs_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstanceGroupManagersRestStub: @@ -1101,6 +1667,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_abandon_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_abandon_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1244,6 +1814,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1415,6 +1989,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_updates_to_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_updates_to_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1585,6 +2163,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1745,6 +2327,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1915,6 +2501,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2084,6 +2674,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2237,6 +2831,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2403,6 +2999,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2545,6 +3145,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2690,6 +3292,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_errors(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_errors_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2841,6 +3447,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_managed_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_managed_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2988,6 +3598,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3158,6 +3772,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3327,6 +3945,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3497,6 +4119,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_recreate_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_recreate_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3657,6 +4283,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3827,6 +4457,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3997,6 +4631,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_instance_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_instance_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4165,6 +4803,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_target_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_target_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4331,6 +4973,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4497,6 +5143,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4667,6 +5317,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_suspend_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_suspend_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4836,6 +5490,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py index 90b1be153830..641c4cca271c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py index aa161a56217c..87af5b318878 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_groups/transports/rest.py @@ -164,12 +164,35 @@ def pre_add_instances( def post_add_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_add_instances` interceptor runs + before the `post_add_instances_with_metadata` interceptor. """ return response + def post_add_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_add_instances_with_metadata` + interceptor in new development instead of the `post_add_instances` interceptor. + When both interceptors are used, this `post_add_instances_with_metadata` interceptor runs after the + `post_add_instances` interceptor. The (possibly modified) response returned by + `post_add_instances` will be passed to + `post_add_instances_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListInstanceGroupsRequest, @@ -190,12 +213,37 @@ def post_aggregated_list( ) -> compute.InstanceGroupAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InstanceGroupAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstanceGroupRequest, @@ -213,12 +261,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstanceGroupRequest, @@ -236,12 +307,35 @@ def pre_get( def post_get(self, response: compute.InstanceGroup) -> compute.InstanceGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInstanceGroupRequest, @@ -259,12 +353,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstanceGroupsRequest, @@ -284,12 +401,35 @@ def post_list( ) -> compute.InstanceGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceGroupList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: compute.ListInstancesInstanceGroupsRequest, @@ -310,12 +450,37 @@ def post_list_instances( ) -> compute.InstanceGroupsListInstances: """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 InstanceGroups 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: compute.InstanceGroupsListInstances, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceGroupsListInstances, 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 InstanceGroups 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_remove_instances( self, request: compute.RemoveInstancesInstanceGroupRequest, @@ -334,12 +499,35 @@ def pre_remove_instances( def post_remove_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_remove_instances` interceptor runs + before the `post_remove_instances_with_metadata` interceptor. """ return response + def post_remove_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_remove_instances_with_metadata` + interceptor in new development instead of the `post_remove_instances` interceptor. + When both interceptors are used, this `post_remove_instances_with_metadata` interceptor runs after the + `post_remove_instances` interceptor. The (possibly modified) response returned by + `post_remove_instances` will be passed to + `post_remove_instances_with_metadata`. + """ + return response, metadata + def pre_set_named_ports( self, request: compute.SetNamedPortsInstanceGroupRequest, @@ -358,12 +546,35 @@ def pre_set_named_ports( def post_set_named_ports(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_named_ports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_named_ports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_set_named_ports` interceptor runs + before the `post_set_named_ports_with_metadata` interceptor. """ return response + def post_set_named_ports_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_named_ports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceGroups server but before it is returned to user code. + + We recommend only using this `post_set_named_ports_with_metadata` + interceptor in new development instead of the `post_set_named_ports` interceptor. + When both interceptors are used, this `post_set_named_ports_with_metadata` interceptor runs after the + `post_set_named_ports` interceptor. The (possibly modified) response returned by + `post_set_named_ports` will be passed to + `post_set_named_ports_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstanceGroupsRestStub: @@ -597,6 +808,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -739,6 +954,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -902,6 +1121,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1058,6 +1281,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1225,6 +1450,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1369,6 +1598,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1517,6 +1748,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 @@ -1686,6 +1921,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1851,6 +2090,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_named_ports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_named_ports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/client.py index fbdce52b0ada..8291cb4642ad 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -462,6 +464,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-compute/google/cloud/compute_v1/services/instance_settings_service/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/transports/rest.py index 959a34cac6a4..6f125f992b7f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_settings_service/transports/rest.py @@ -107,12 +107,35 @@ def pre_get( def post_get(self, response: compute.InstanceSettings) -> compute.InstanceSettings: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceSettingsService server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceSettings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceSettingsService server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchInstanceSettingRequest, @@ -130,12 +153,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceSettingsService server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceSettingsService server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstanceSettingsServiceRestStub: @@ -354,6 +400,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -520,6 +568,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/client.py index cc5f086155c4..0bef30795e52 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/instance_templates/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/transports/rest.py index 1d63419650cd..e7828267b6f1 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instance_templates/transports/rest.py @@ -158,12 +158,37 @@ def post_aggregated_list( ) -> compute.InstanceTemplateAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InstanceTemplateAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstanceTemplateAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstanceTemplateRequest, @@ -181,12 +206,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstanceTemplateRequest, @@ -204,12 +252,35 @@ def pre_get( def post_get(self, response: compute.InstanceTemplate) -> compute.InstanceTemplate: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceTemplate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceTemplate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyInstanceTemplateRequest, @@ -228,12 +299,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 InstanceTemplates 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InstanceTemplates 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_insert( self, request: compute.InsertInstanceTemplateRequest, @@ -251,12 +345,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstanceTemplatesRequest, @@ -276,12 +393,35 @@ def post_list( ) -> compute.InstanceTemplateList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceTemplateList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceTemplateList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyInstanceTemplateRequest, @@ -300,12 +440,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 InstanceTemplates 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InstanceTemplates 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: compute.TestIamPermissionsInstanceTemplateRequest, @@ -326,12 +489,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 InstanceTemplates 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 InstanceTemplates 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 InstanceTemplatesRestStub: @@ -545,6 +733,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -710,6 +902,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -867,6 +1063,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1032,6 +1230,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 @@ -1203,6 +1405,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1349,6 +1555,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1520,6 +1728,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 @@ -1671,6 +1883,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-compute/google/cloud/compute_v1/services/instances/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py index 73fb9fb7f43f..5df2a088c47e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/instances/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py index 0dda8127c528..112f97691957 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instances/transports/rest.py @@ -475,12 +475,35 @@ def pre_add_access_config( def post_add_access_config(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_access_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_access_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_add_access_config` interceptor runs + before the `post_add_access_config_with_metadata` interceptor. """ return response + def post_add_access_config_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_access_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_add_access_config_with_metadata` + interceptor in new development instead of the `post_add_access_config` interceptor. + When both interceptors are used, this `post_add_access_config_with_metadata` interceptor runs after the + `post_add_access_config` interceptor. The (possibly modified) response returned by + `post_add_access_config` will be passed to + `post_add_access_config_with_metadata`. + """ + return response, metadata + def pre_add_resource_policies( self, request: compute.AddResourcePoliciesInstanceRequest, @@ -501,12 +524,35 @@ def post_add_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for add_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_add_resource_policies` interceptor runs + before the `post_add_resource_policies_with_metadata` interceptor. """ return response + def post_add_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_add_resource_policies_with_metadata` + interceptor in new development instead of the `post_add_resource_policies` interceptor. + When both interceptors are used, this `post_add_resource_policies_with_metadata` interceptor runs after the + `post_add_resource_policies` interceptor. The (possibly modified) response returned by + `post_add_resource_policies` will be passed to + `post_add_resource_policies_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListInstancesRequest, @@ -526,12 +572,35 @@ def post_aggregated_list( ) -> compute.InstanceAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InstanceAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_attach_disk( self, request: compute.AttachDiskInstanceRequest, @@ -549,12 +618,35 @@ def pre_attach_disk( def post_attach_disk(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for attach_disk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_attach_disk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_attach_disk` interceptor runs + before the `post_attach_disk_with_metadata` interceptor. """ return response + def post_attach_disk_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for attach_disk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_attach_disk_with_metadata` + interceptor in new development instead of the `post_attach_disk` interceptor. + When both interceptors are used, this `post_attach_disk_with_metadata` interceptor runs after the + `post_attach_disk` interceptor. The (possibly modified) response returned by + `post_attach_disk` will be passed to + `post_attach_disk_with_metadata`. + """ + return response, metadata + def pre_bulk_insert( self, request: compute.BulkInsertInstanceRequest, @@ -572,12 +664,35 @@ def pre_bulk_insert( def post_bulk_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for bulk_insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_bulk_insert` interceptor runs + before the `post_bulk_insert_with_metadata` interceptor. """ return response + def post_bulk_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_bulk_insert_with_metadata` + interceptor in new development instead of the `post_bulk_insert` interceptor. + When both interceptors are used, this `post_bulk_insert_with_metadata` interceptor runs after the + `post_bulk_insert` interceptor. The (possibly modified) response returned by + `post_bulk_insert` will be passed to + `post_bulk_insert_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstanceRequest, @@ -593,12 +708,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_access_config( self, request: compute.DeleteAccessConfigInstanceRequest, @@ -619,12 +757,35 @@ def post_delete_access_config( ) -> compute.Operation: """Post-rpc interceptor for delete_access_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_access_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_delete_access_config` interceptor runs + before the `post_delete_access_config_with_metadata` interceptor. """ return response + def post_delete_access_config_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_access_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_delete_access_config_with_metadata` + interceptor in new development instead of the `post_delete_access_config` interceptor. + When both interceptors are used, this `post_delete_access_config_with_metadata` interceptor runs after the + `post_delete_access_config` interceptor. The (possibly modified) response returned by + `post_delete_access_config` will be passed to + `post_delete_access_config_with_metadata`. + """ + return response, metadata + def pre_detach_disk( self, request: compute.DetachDiskInstanceRequest, @@ -642,12 +803,35 @@ def pre_detach_disk( def post_detach_disk(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for detach_disk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_detach_disk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_detach_disk` interceptor runs + before the `post_detach_disk_with_metadata` interceptor. """ return response + def post_detach_disk_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for detach_disk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_detach_disk_with_metadata` + interceptor in new development instead of the `post_detach_disk` interceptor. + When both interceptors are used, this `post_detach_disk_with_metadata` interceptor runs after the + `post_detach_disk` interceptor. The (possibly modified) response returned by + `post_detach_disk` will be passed to + `post_detach_disk_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstanceRequest, @@ -663,12 +847,35 @@ def pre_get( def post_get(self, response: compute.Instance) -> compute.Instance: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Instance, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_effective_firewalls( self, request: compute.GetEffectiveFirewallsInstanceRequest, @@ -689,12 +896,38 @@ def post_get_effective_firewalls( ) -> compute.InstancesGetEffectiveFirewallsResponse: """Post-rpc interceptor for get_effective_firewalls - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_firewalls_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_firewalls` interceptor runs + before the `post_get_effective_firewalls_with_metadata` interceptor. """ return response + def post_get_effective_firewalls_with_metadata( + self, + response: compute.InstancesGetEffectiveFirewallsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstancesGetEffectiveFirewallsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_firewalls + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_effective_firewalls_with_metadata` + interceptor in new development instead of the `post_get_effective_firewalls` interceptor. + When both interceptors are used, this `post_get_effective_firewalls_with_metadata` interceptor runs after the + `post_get_effective_firewalls` interceptor. The (possibly modified) response returned by + `post_get_effective_firewalls` will be passed to + `post_get_effective_firewalls_with_metadata`. + """ + return response, metadata + def pre_get_guest_attributes( self, request: compute.GetGuestAttributesInstanceRequest, @@ -715,12 +948,35 @@ def post_get_guest_attributes( ) -> compute.GuestAttributes: """Post-rpc interceptor for get_guest_attributes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_guest_attributes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get_guest_attributes` interceptor runs + before the `post_get_guest_attributes_with_metadata` interceptor. """ return response + def post_get_guest_attributes_with_metadata( + self, + response: compute.GuestAttributes, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.GuestAttributes, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_guest_attributes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_guest_attributes_with_metadata` + interceptor in new development instead of the `post_get_guest_attributes` interceptor. + When both interceptors are used, this `post_get_guest_attributes_with_metadata` interceptor runs after the + `post_get_guest_attributes` interceptor. The (possibly modified) response returned by + `post_get_guest_attributes` will be passed to + `post_get_guest_attributes_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyInstanceRequest, @@ -738,12 +994,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Instances 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Instances 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_screenshot( self, request: compute.GetScreenshotInstanceRequest, @@ -761,12 +1040,35 @@ def pre_get_screenshot( def post_get_screenshot(self, response: compute.Screenshot) -> compute.Screenshot: """Post-rpc interceptor for get_screenshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_screenshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get_screenshot` interceptor runs + before the `post_get_screenshot_with_metadata` interceptor. """ return response + def post_get_screenshot_with_metadata( + self, + response: compute.Screenshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Screenshot, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_screenshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_screenshot_with_metadata` + interceptor in new development instead of the `post_get_screenshot` interceptor. + When both interceptors are used, this `post_get_screenshot_with_metadata` interceptor runs after the + `post_get_screenshot` interceptor. The (possibly modified) response returned by + `post_get_screenshot` will be passed to + `post_get_screenshot_with_metadata`. + """ + return response, metadata + def pre_get_serial_port_output( self, request: compute.GetSerialPortOutputInstanceRequest, @@ -787,12 +1089,35 @@ def post_get_serial_port_output( ) -> compute.SerialPortOutput: """Post-rpc interceptor for get_serial_port_output - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_serial_port_output_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get_serial_port_output` interceptor runs + before the `post_get_serial_port_output_with_metadata` interceptor. """ return response + def post_get_serial_port_output_with_metadata( + self, + response: compute.SerialPortOutput, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SerialPortOutput, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_serial_port_output + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_serial_port_output_with_metadata` + interceptor in new development instead of the `post_get_serial_port_output` interceptor. + When both interceptors are used, this `post_get_serial_port_output_with_metadata` interceptor runs after the + `post_get_serial_port_output` interceptor. The (possibly modified) response returned by + `post_get_serial_port_output` will be passed to + `post_get_serial_port_output_with_metadata`. + """ + return response, metadata + def pre_get_shielded_instance_identity( self, request: compute.GetShieldedInstanceIdentityInstanceRequest, @@ -813,12 +1138,37 @@ def post_get_shielded_instance_identity( ) -> compute.ShieldedInstanceIdentity: """Post-rpc interceptor for get_shielded_instance_identity - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_shielded_instance_identity_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_get_shielded_instance_identity` interceptor runs + before the `post_get_shielded_instance_identity_with_metadata` interceptor. """ return response + def post_get_shielded_instance_identity_with_metadata( + self, + response: compute.ShieldedInstanceIdentity, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ShieldedInstanceIdentity, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_shielded_instance_identity + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_get_shielded_instance_identity_with_metadata` + interceptor in new development instead of the `post_get_shielded_instance_identity` interceptor. + When both interceptors are used, this `post_get_shielded_instance_identity_with_metadata` interceptor runs after the + `post_get_shielded_instance_identity` interceptor. The (possibly modified) response returned by + `post_get_shielded_instance_identity` will be passed to + `post_get_shielded_instance_identity_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInstanceRequest, @@ -834,12 +1184,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstancesRequest, @@ -855,12 +1228,35 @@ def pre_list( def post_list(self, response: compute.InstanceList) -> compute.InstanceList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_referrers( self, request: compute.ListReferrersInstancesRequest, @@ -880,12 +1276,35 @@ def post_list_referrers( ) -> compute.InstanceListReferrers: """Post-rpc interceptor for list_referrers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_referrers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_list_referrers` interceptor runs + before the `post_list_referrers_with_metadata` interceptor. """ return response + def post_list_referrers_with_metadata( + self, + response: compute.InstanceListReferrers, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceListReferrers, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_referrers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_list_referrers_with_metadata` + interceptor in new development instead of the `post_list_referrers` interceptor. + When both interceptors are used, this `post_list_referrers_with_metadata` interceptor runs after the + `post_list_referrers` interceptor. The (possibly modified) response returned by + `post_list_referrers` will be passed to + `post_list_referrers_with_metadata`. + """ + return response, metadata + def pre_perform_maintenance( self, request: compute.PerformMaintenanceInstanceRequest, @@ -906,12 +1325,35 @@ def post_perform_maintenance( ) -> compute.Operation: """Post-rpc interceptor for perform_maintenance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_perform_maintenance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_perform_maintenance` interceptor runs + before the `post_perform_maintenance_with_metadata` interceptor. """ return response + def post_perform_maintenance_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for perform_maintenance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_perform_maintenance_with_metadata` + interceptor in new development instead of the `post_perform_maintenance` interceptor. + When both interceptors are used, this `post_perform_maintenance_with_metadata` interceptor runs after the + `post_perform_maintenance` interceptor. The (possibly modified) response returned by + `post_perform_maintenance` will be passed to + `post_perform_maintenance_with_metadata`. + """ + return response, metadata + def pre_remove_resource_policies( self, request: compute.RemoveResourcePoliciesInstanceRequest, @@ -932,12 +1374,35 @@ def post_remove_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for remove_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_remove_resource_policies` interceptor runs + before the `post_remove_resource_policies_with_metadata` interceptor. """ return response + def post_remove_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_remove_resource_policies_with_metadata` + interceptor in new development instead of the `post_remove_resource_policies` interceptor. + When both interceptors are used, this `post_remove_resource_policies_with_metadata` interceptor runs after the + `post_remove_resource_policies` interceptor. The (possibly modified) response returned by + `post_remove_resource_policies` will be passed to + `post_remove_resource_policies_with_metadata`. + """ + return response, metadata + def pre_reset( self, request: compute.ResetInstanceRequest, @@ -953,12 +1418,35 @@ def pre_reset( def post_reset(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for reset - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reset_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_reset` interceptor runs + before the `post_reset_with_metadata` interceptor. """ return response + def post_reset_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for reset + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_reset_with_metadata` + interceptor in new development instead of the `post_reset` interceptor. + When both interceptors are used, this `post_reset_with_metadata` interceptor runs after the + `post_reset` interceptor. The (possibly modified) response returned by + `post_reset` will be passed to + `post_reset_with_metadata`. + """ + return response, metadata + def pre_resume( self, request: compute.ResumeInstanceRequest, @@ -974,12 +1462,35 @@ def pre_resume( def post_resume(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resume - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_resume` interceptor runs + before the `post_resume_with_metadata` interceptor. """ return response + def post_resume_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_resume_with_metadata` + interceptor in new development instead of the `post_resume` interceptor. + When both interceptors are used, this `post_resume_with_metadata` interceptor runs after the + `post_resume` interceptor. The (possibly modified) response returned by + `post_resume` will be passed to + `post_resume_with_metadata`. + """ + return response, metadata + def pre_send_diagnostic_interrupt( self, request: compute.SendDiagnosticInterruptInstanceRequest, @@ -1000,12 +1511,38 @@ def post_send_diagnostic_interrupt( ) -> compute.SendDiagnosticInterruptInstanceResponse: """Post-rpc interceptor for send_diagnostic_interrupt - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_send_diagnostic_interrupt_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_send_diagnostic_interrupt` interceptor runs + before the `post_send_diagnostic_interrupt_with_metadata` interceptor. """ return response + def post_send_diagnostic_interrupt_with_metadata( + self, + response: compute.SendDiagnosticInterruptInstanceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SendDiagnosticInterruptInstanceResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for send_diagnostic_interrupt + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_send_diagnostic_interrupt_with_metadata` + interceptor in new development instead of the `post_send_diagnostic_interrupt` interceptor. + When both interceptors are used, this `post_send_diagnostic_interrupt_with_metadata` interceptor runs after the + `post_send_diagnostic_interrupt` interceptor. The (possibly modified) response returned by + `post_send_diagnostic_interrupt` will be passed to + `post_send_diagnostic_interrupt_with_metadata`. + """ + return response, metadata + def pre_set_deletion_protection( self, request: compute.SetDeletionProtectionInstanceRequest, @@ -1026,12 +1563,35 @@ def post_set_deletion_protection( ) -> compute.Operation: """Post-rpc interceptor for set_deletion_protection - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_deletion_protection_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_deletion_protection` interceptor runs + before the `post_set_deletion_protection_with_metadata` interceptor. """ return response + def post_set_deletion_protection_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_deletion_protection + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_deletion_protection_with_metadata` + interceptor in new development instead of the `post_set_deletion_protection` interceptor. + When both interceptors are used, this `post_set_deletion_protection_with_metadata` interceptor runs after the + `post_set_deletion_protection` interceptor. The (possibly modified) response returned by + `post_set_deletion_protection` will be passed to + `post_set_deletion_protection_with_metadata`. + """ + return response, metadata + def pre_set_disk_auto_delete( self, request: compute.SetDiskAutoDeleteInstanceRequest, @@ -1052,12 +1612,35 @@ def post_set_disk_auto_delete( ) -> compute.Operation: """Post-rpc interceptor for set_disk_auto_delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_disk_auto_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_disk_auto_delete` interceptor runs + before the `post_set_disk_auto_delete_with_metadata` interceptor. """ return response + def post_set_disk_auto_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_disk_auto_delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_disk_auto_delete_with_metadata` + interceptor in new development instead of the `post_set_disk_auto_delete` interceptor. + When both interceptors are used, this `post_set_disk_auto_delete_with_metadata` interceptor runs after the + `post_set_disk_auto_delete` interceptor. The (possibly modified) response returned by + `post_set_disk_auto_delete` will be passed to + `post_set_disk_auto_delete_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyInstanceRequest, @@ -1075,12 +1658,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Instances 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Instances 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_set_labels( self, request: compute.SetLabelsInstanceRequest, @@ -1098,12 +1704,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Instances 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Instances 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_machine_resources( self, request: compute.SetMachineResourcesInstanceRequest, @@ -1124,12 +1753,35 @@ def post_set_machine_resources( ) -> compute.Operation: """Post-rpc interceptor for set_machine_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_machine_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_machine_resources` interceptor runs + before the `post_set_machine_resources_with_metadata` interceptor. """ return response + def post_set_machine_resources_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_machine_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_machine_resources_with_metadata` + interceptor in new development instead of the `post_set_machine_resources` interceptor. + When both interceptors are used, this `post_set_machine_resources_with_metadata` interceptor runs after the + `post_set_machine_resources` interceptor. The (possibly modified) response returned by + `post_set_machine_resources` will be passed to + `post_set_machine_resources_with_metadata`. + """ + return response, metadata + def pre_set_machine_type( self, request: compute.SetMachineTypeInstanceRequest, @@ -1147,12 +1799,35 @@ def pre_set_machine_type( def post_set_machine_type(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_machine_type - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_machine_type_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_machine_type` interceptor runs + before the `post_set_machine_type_with_metadata` interceptor. """ return response + def post_set_machine_type_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_machine_type + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_machine_type_with_metadata` + interceptor in new development instead of the `post_set_machine_type` interceptor. + When both interceptors are used, this `post_set_machine_type_with_metadata` interceptor runs after the + `post_set_machine_type` interceptor. The (possibly modified) response returned by + `post_set_machine_type` will be passed to + `post_set_machine_type_with_metadata`. + """ + return response, metadata + def pre_set_metadata( self, request: compute.SetMetadataInstanceRequest, @@ -1170,12 +1845,35 @@ def pre_set_metadata( def post_set_metadata(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_metadata - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_metadata_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_metadata` interceptor runs + before the `post_set_metadata_with_metadata` interceptor. """ return response + def post_set_metadata_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_metadata + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_metadata_with_metadata` + interceptor in new development instead of the `post_set_metadata` interceptor. + When both interceptors are used, this `post_set_metadata_with_metadata` interceptor runs after the + `post_set_metadata` interceptor. The (possibly modified) response returned by + `post_set_metadata` will be passed to + `post_set_metadata_with_metadata`. + """ + return response, metadata + def pre_set_min_cpu_platform( self, request: compute.SetMinCpuPlatformInstanceRequest, @@ -1196,12 +1894,35 @@ def post_set_min_cpu_platform( ) -> compute.Operation: """Post-rpc interceptor for set_min_cpu_platform - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_min_cpu_platform_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_min_cpu_platform` interceptor runs + before the `post_set_min_cpu_platform_with_metadata` interceptor. """ return response + def post_set_min_cpu_platform_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_min_cpu_platform + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_min_cpu_platform_with_metadata` + interceptor in new development instead of the `post_set_min_cpu_platform` interceptor. + When both interceptors are used, this `post_set_min_cpu_platform_with_metadata` interceptor runs after the + `post_set_min_cpu_platform` interceptor. The (possibly modified) response returned by + `post_set_min_cpu_platform` will be passed to + `post_set_min_cpu_platform_with_metadata`. + """ + return response, metadata + def pre_set_name( self, request: compute.SetNameInstanceRequest, @@ -1217,12 +1938,35 @@ def pre_set_name( def post_set_name(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_name - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_name_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_name` interceptor runs + before the `post_set_name_with_metadata` interceptor. """ return response + def post_set_name_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_name + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_name_with_metadata` + interceptor in new development instead of the `post_set_name` interceptor. + When both interceptors are used, this `post_set_name_with_metadata` interceptor runs after the + `post_set_name` interceptor. The (possibly modified) response returned by + `post_set_name` will be passed to + `post_set_name_with_metadata`. + """ + return response, metadata + def pre_set_scheduling( self, request: compute.SetSchedulingInstanceRequest, @@ -1240,12 +1984,35 @@ def pre_set_scheduling( def post_set_scheduling(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_scheduling - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_scheduling_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_scheduling` interceptor runs + before the `post_set_scheduling_with_metadata` interceptor. """ return response + def post_set_scheduling_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_scheduling + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_scheduling_with_metadata` + interceptor in new development instead of the `post_set_scheduling` interceptor. + When both interceptors are used, this `post_set_scheduling_with_metadata` interceptor runs after the + `post_set_scheduling` interceptor. The (possibly modified) response returned by + `post_set_scheduling` will be passed to + `post_set_scheduling_with_metadata`. + """ + return response, metadata + def pre_set_security_policy( self, request: compute.SetSecurityPolicyInstanceRequest, @@ -1266,12 +2033,35 @@ def post_set_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_security_policy` interceptor runs + before the `post_set_security_policy_with_metadata` interceptor. """ return response + def post_set_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_security_policy_with_metadata` + interceptor in new development instead of the `post_set_security_policy` interceptor. + When both interceptors are used, this `post_set_security_policy_with_metadata` interceptor runs after the + `post_set_security_policy` interceptor. The (possibly modified) response returned by + `post_set_security_policy` will be passed to + `post_set_security_policy_with_metadata`. + """ + return response, metadata + def pre_set_service_account( self, request: compute.SetServiceAccountInstanceRequest, @@ -1292,12 +2082,35 @@ def post_set_service_account( ) -> compute.Operation: """Post-rpc interceptor for set_service_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_service_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_service_account` interceptor runs + before the `post_set_service_account_with_metadata` interceptor. """ return response + def post_set_service_account_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_service_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_service_account_with_metadata` + interceptor in new development instead of the `post_set_service_account` interceptor. + When both interceptors are used, this `post_set_service_account_with_metadata` interceptor runs after the + `post_set_service_account` interceptor. The (possibly modified) response returned by + `post_set_service_account` will be passed to + `post_set_service_account_with_metadata`. + """ + return response, metadata + def pre_set_shielded_instance_integrity_policy( self, request: compute.SetShieldedInstanceIntegrityPolicyInstanceRequest, @@ -1318,12 +2131,35 @@ def post_set_shielded_instance_integrity_policy( ) -> compute.Operation: """Post-rpc interceptor for set_shielded_instance_integrity_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_shielded_instance_integrity_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_shielded_instance_integrity_policy` interceptor runs + before the `post_set_shielded_instance_integrity_policy_with_metadata` interceptor. """ return response + def post_set_shielded_instance_integrity_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_shielded_instance_integrity_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_shielded_instance_integrity_policy_with_metadata` + interceptor in new development instead of the `post_set_shielded_instance_integrity_policy` interceptor. + When both interceptors are used, this `post_set_shielded_instance_integrity_policy_with_metadata` interceptor runs after the + `post_set_shielded_instance_integrity_policy` interceptor. The (possibly modified) response returned by + `post_set_shielded_instance_integrity_policy` will be passed to + `post_set_shielded_instance_integrity_policy_with_metadata`. + """ + return response, metadata + def pre_set_tags( self, request: compute.SetTagsInstanceRequest, @@ -1339,12 +2175,35 @@ def pre_set_tags( def post_set_tags(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_tags - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_tags_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_set_tags` interceptor runs + before the `post_set_tags_with_metadata` interceptor. """ return response + def post_set_tags_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_tags + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_set_tags_with_metadata` + interceptor in new development instead of the `post_set_tags` interceptor. + When both interceptors are used, this `post_set_tags_with_metadata` interceptor runs after the + `post_set_tags` interceptor. The (possibly modified) response returned by + `post_set_tags` will be passed to + `post_set_tags_with_metadata`. + """ + return response, metadata + def pre_simulate_maintenance_event( self, request: compute.SimulateMaintenanceEventInstanceRequest, @@ -1365,12 +2224,35 @@ def post_simulate_maintenance_event( ) -> compute.Operation: """Post-rpc interceptor for simulate_maintenance_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_simulate_maintenance_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_simulate_maintenance_event` interceptor runs + before the `post_simulate_maintenance_event_with_metadata` interceptor. """ return response + def post_simulate_maintenance_event_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for simulate_maintenance_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_simulate_maintenance_event_with_metadata` + interceptor in new development instead of the `post_simulate_maintenance_event` interceptor. + When both interceptors are used, this `post_simulate_maintenance_event_with_metadata` interceptor runs after the + `post_simulate_maintenance_event` interceptor. The (possibly modified) response returned by + `post_simulate_maintenance_event` will be passed to + `post_simulate_maintenance_event_with_metadata`. + """ + return response, metadata + def pre_start( self, request: compute.StartInstanceRequest, @@ -1386,12 +2268,35 @@ def pre_start( def post_start(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for start - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_start` interceptor runs + before the `post_start_with_metadata` interceptor. """ return response + def post_start_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_start_with_metadata` + interceptor in new development instead of the `post_start` interceptor. + When both interceptors are used, this `post_start_with_metadata` interceptor runs after the + `post_start` interceptor. The (possibly modified) response returned by + `post_start` will be passed to + `post_start_with_metadata`. + """ + return response, metadata + def pre_start_with_encryption_key( self, request: compute.StartWithEncryptionKeyInstanceRequest, @@ -1412,12 +2317,35 @@ def post_start_with_encryption_key( ) -> compute.Operation: """Post-rpc interceptor for start_with_encryption_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_with_encryption_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_start_with_encryption_key` interceptor runs + before the `post_start_with_encryption_key_with_metadata` interceptor. """ return response + def post_start_with_encryption_key_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_with_encryption_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_start_with_encryption_key_with_metadata` + interceptor in new development instead of the `post_start_with_encryption_key` interceptor. + When both interceptors are used, this `post_start_with_encryption_key_with_metadata` interceptor runs after the + `post_start_with_encryption_key` interceptor. The (possibly modified) response returned by + `post_start_with_encryption_key` will be passed to + `post_start_with_encryption_key_with_metadata`. + """ + return response, metadata + def pre_stop( self, request: compute.StopInstanceRequest, @@ -1433,12 +2361,35 @@ def pre_stop( def post_stop(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for stop - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_stop` interceptor runs + before the `post_stop_with_metadata` interceptor. """ return response + def post_stop_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_stop_with_metadata` + interceptor in new development instead of the `post_stop` interceptor. + When both interceptors are used, this `post_stop_with_metadata` interceptor runs after the + `post_stop` interceptor. The (possibly modified) response returned by + `post_stop` will be passed to + `post_stop_with_metadata`. + """ + return response, metadata + def pre_suspend( self, request: compute.SuspendInstanceRequest, @@ -1454,12 +2405,35 @@ def pre_suspend( def post_suspend(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for suspend - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_suspend_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_suspend` interceptor runs + before the `post_suspend_with_metadata` interceptor. """ return response + def post_suspend_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for suspend + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_suspend_with_metadata` + interceptor in new development instead of the `post_suspend` interceptor. + When both interceptors are used, this `post_suspend_with_metadata` interceptor runs after the + `post_suspend` interceptor. The (possibly modified) response returned by + `post_suspend` will be passed to + `post_suspend_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsInstanceRequest, @@ -1480,12 +2454,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Instances 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Instances 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( self, request: compute.UpdateInstanceRequest, @@ -1501,12 +2500,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + def pre_update_access_config( self, request: compute.UpdateAccessConfigInstanceRequest, @@ -1527,12 +2549,35 @@ def post_update_access_config( ) -> compute.Operation: """Post-rpc interceptor for update_access_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_access_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_update_access_config` interceptor runs + before the `post_update_access_config_with_metadata` interceptor. """ return response + def post_update_access_config_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_access_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_update_access_config_with_metadata` + interceptor in new development instead of the `post_update_access_config` interceptor. + When both interceptors are used, this `post_update_access_config_with_metadata` interceptor runs after the + `post_update_access_config` interceptor. The (possibly modified) response returned by + `post_update_access_config` will be passed to + `post_update_access_config_with_metadata`. + """ + return response, metadata + def pre_update_display_device( self, request: compute.UpdateDisplayDeviceInstanceRequest, @@ -1553,12 +2598,35 @@ def post_update_display_device( ) -> compute.Operation: """Post-rpc interceptor for update_display_device - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_display_device_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_update_display_device` interceptor runs + before the `post_update_display_device_with_metadata` interceptor. """ return response + def post_update_display_device_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_display_device + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_update_display_device_with_metadata` + interceptor in new development instead of the `post_update_display_device` interceptor. + When both interceptors are used, this `post_update_display_device_with_metadata` interceptor runs after the + `post_update_display_device` interceptor. The (possibly modified) response returned by + `post_update_display_device` will be passed to + `post_update_display_device_with_metadata`. + """ + return response, metadata + def pre_update_network_interface( self, request: compute.UpdateNetworkInterfaceInstanceRequest, @@ -1579,12 +2647,35 @@ def post_update_network_interface( ) -> compute.Operation: """Post-rpc interceptor for update_network_interface - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_network_interface_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_update_network_interface` interceptor runs + before the `post_update_network_interface_with_metadata` interceptor. """ return response + def post_update_network_interface_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_network_interface + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_update_network_interface_with_metadata` + interceptor in new development instead of the `post_update_network_interface` interceptor. + When both interceptors are used, this `post_update_network_interface_with_metadata` interceptor runs after the + `post_update_network_interface` interceptor. The (possibly modified) response returned by + `post_update_network_interface` will be passed to + `post_update_network_interface_with_metadata`. + """ + return response, metadata + def pre_update_shielded_instance_config( self, request: compute.UpdateShieldedInstanceConfigInstanceRequest, @@ -1605,12 +2696,35 @@ def post_update_shielded_instance_config( ) -> compute.Operation: """Post-rpc interceptor for update_shielded_instance_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_shielded_instance_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Instances server but before - it is returned to user code. + it is returned to user code. This `post_update_shielded_instance_config` interceptor runs + before the `post_update_shielded_instance_config_with_metadata` interceptor. """ return response + def post_update_shielded_instance_config_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_shielded_instance_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Instances server but before it is returned to user code. + + We recommend only using this `post_update_shielded_instance_config_with_metadata` + interceptor in new development instead of the `post_update_shielded_instance_config` interceptor. + When both interceptors are used, this `post_update_shielded_instance_config_with_metadata` interceptor runs after the + `post_update_shielded_instance_config` interceptor. The (possibly modified) response returned by + `post_update_shielded_instance_config` will be passed to + `post_update_shielded_instance_config_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InstancesRestStub: @@ -1850,6 +2964,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_access_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_access_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2017,6 +3135,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2163,6 +3285,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2330,6 +3456,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_attach_disk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_attach_disk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2497,6 +3627,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2656,6 +3790,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2817,6 +3955,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_access_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_access_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2978,6 +4120,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_detach_disk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_detach_disk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3122,6 +4268,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3266,6 +4414,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_effective_firewalls(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_effective_firewalls_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3412,6 +4564,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_guest_attributes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_guest_attributes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3581,6 +4737,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 @@ -3727,6 +4887,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_screenshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_screenshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3871,6 +5035,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_serial_port_output(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_serial_port_output_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4018,6 +5186,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_shielded_instance_identity(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_shielded_instance_identity_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4185,6 +5360,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4324,6 +5503,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4472,6 +5653,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_referrers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_referrers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4633,6 +5818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_perform_maintenance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_perform_maintenance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4800,6 +5989,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4959,6 +6152,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_reset(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_reset_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5118,6 +6315,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5265,6 +6466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_send_diagnostic_interrupt(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_send_diagnostic_interrupt_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5430,6 +6635,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_deletion_protection(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_deletion_protection_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5591,6 +6800,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_disk_auto_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_disk_auto_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5766,6 +6979,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 @@ -5933,6 +7150,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 @@ -6100,6 +7321,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_machine_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_machine_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6273,6 +7498,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_machine_type(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_machine_type_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6440,6 +7669,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_metadata(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_metadata_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6607,6 +7840,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_min_cpu_platform(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_min_cpu_platform_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6772,6 +8009,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_name(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_name_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6943,6 +8184,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_scheduling(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_scheduling_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7110,6 +8355,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7277,6 +8526,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_service_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_service_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7449,6 +8702,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_shielded_instance_integrity_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_set_shielded_instance_integrity_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7614,6 +8874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_tags(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_tags_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7776,6 +9040,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_simulate_maintenance_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_simulate_maintenance_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7935,6 +9203,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8102,6 +9374,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_with_encryption_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_with_encryption_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8258,6 +9534,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8417,6 +9695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_suspend(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_suspend_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8567,6 +9849,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 @@ -8732,6 +10018,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8899,6 +10189,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_access_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_access_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9066,6 +10360,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_display_device(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_display_device_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9233,6 +10531,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_network_interface(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_network_interface_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9403,6 +10705,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_shielded_instance_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_shielded_instance_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/client.py index f5d8ed835d02..66181f88e686 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/instant_snapshots/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/transports/rest.py index d2cce9d83f8d..8682fd2090af 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/instant_snapshots/transports/rest.py @@ -166,12 +166,37 @@ def post_aggregated_list( ) -> compute.InstantSnapshotAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InstantSnapshotAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InstantSnapshotAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInstantSnapshotRequest, @@ -189,12 +214,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInstantSnapshotRequest, @@ -212,12 +260,35 @@ def pre_get( def post_get(self, response: compute.InstantSnapshot) -> compute.InstantSnapshot: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstantSnapshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstantSnapshot, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyInstantSnapshotRequest, @@ -236,12 +307,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 InstantSnapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InstantSnapshots 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_insert( self, request: compute.InsertInstantSnapshotRequest, @@ -259,12 +353,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInstantSnapshotsRequest, @@ -284,12 +401,35 @@ def post_list( ) -> compute.InstantSnapshotList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstantSnapshotList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstantSnapshotList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyInstantSnapshotRequest, @@ -308,12 +448,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 InstantSnapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InstantSnapshots 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_set_labels( self, request: compute.SetLabelsInstantSnapshotRequest, @@ -331,12 +494,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 InstantSnapshots 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InstantSnapshots 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_test_iam_permissions( self, request: compute.TestIamPermissionsInstantSnapshotRequest, @@ -357,12 +543,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 InstantSnapshots 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 InstantSnapshots 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 InstantSnapshotsRestStub: @@ -573,6 +784,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -738,6 +953,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -885,6 +1104,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1050,6 +1271,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 @@ -1221,6 +1446,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1367,6 +1596,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1538,6 +1769,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 @@ -1703,6 +1938,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 @@ -1854,6 +2093,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-compute/google/cloud/compute_v1/services/interconnect_attachments/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/client.py index d9a865e9f15a..6a00def9fdf9 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/interconnect_attachments/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/transports/rest.py index d34a2f82d66b..2d9e1a49a4a8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_attachments/transports/rest.py @@ -150,12 +150,38 @@ def post_aggregated_list( ) -> compute.InterconnectAttachmentAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.InterconnectAttachmentAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectAttachmentAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteInterconnectAttachmentRequest, @@ -174,12 +200,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInterconnectAttachmentRequest, @@ -200,12 +249,35 @@ def post_get( ) -> compute.InterconnectAttachment: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InterconnectAttachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InterconnectAttachment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInterconnectAttachmentRequest, @@ -224,12 +296,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInterconnectAttachmentsRequest, @@ -250,12 +345,37 @@ def post_list( ) -> compute.InterconnectAttachmentList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InterconnectAttachmentList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectAttachmentList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchInterconnectAttachmentRequest, @@ -274,12 +394,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectAttachments server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectAttachments server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsInterconnectAttachmentRequest, @@ -298,12 +441,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 InterconnectAttachments 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 InterconnectAttachments 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 + @dataclasses.dataclass class InterconnectAttachmentsRestStub: @@ -517,6 +683,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -679,6 +849,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -830,6 +1004,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -996,6 +1172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1142,6 +1322,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1310,6 +1492,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1476,6 +1662,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/client.py index eac11cd73c81..3b837cf5c65c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/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 @@ -460,6 +462,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-compute/google/cloud/compute_v1/services/interconnect_locations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/transports/rest.py index f013556c5b60..64d18dc3a89e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_locations/transports/rest.py @@ -109,12 +109,35 @@ def post_get( ) -> compute.InterconnectLocation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectLocations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InterconnectLocation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InterconnectLocation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectLocations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInterconnectLocationsRequest, @@ -135,12 +158,37 @@ def post_list( ) -> compute.InterconnectLocationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectLocations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InterconnectLocationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectLocationList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectLocations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InterconnectLocationsRestStub: @@ -360,6 +408,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -505,6 +555,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/client.py index ff52cd42d4db..7257931a3c45 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/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 @@ -462,6 +464,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-compute/google/cloud/compute_v1/services/interconnect_remote_locations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/transports/rest.py index ae52a5a8d009..068b9e455b3a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnect_remote_locations/transports/rest.py @@ -110,12 +110,37 @@ def post_get( ) -> compute.InterconnectRemoteLocation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectRemoteLocations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InterconnectRemoteLocation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectRemoteLocation, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectRemoteLocations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInterconnectRemoteLocationsRequest, @@ -136,12 +161,37 @@ def post_list( ) -> compute.InterconnectRemoteLocationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the InterconnectRemoteLocations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InterconnectRemoteLocationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectRemoteLocationList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the InterconnectRemoteLocations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class InterconnectRemoteLocationsRestStub: @@ -360,6 +410,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -508,6 +560,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/client.py index c6903a51675e..8ee45d6125b5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/interconnects/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/transports/rest.py index 9e6c92da9135..48f3dcd3f57c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/interconnects/transports/rest.py @@ -155,12 +155,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetInterconnectRequest, @@ -176,12 +199,35 @@ def pre_get( def post_get(self, response: compute.Interconnect) -> compute.Interconnect: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Interconnect, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Interconnect, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_diagnostics( self, request: compute.GetDiagnosticsInterconnectRequest, @@ -202,12 +248,38 @@ def post_get_diagnostics( ) -> compute.InterconnectsGetDiagnosticsResponse: """Post-rpc interceptor for get_diagnostics - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_diagnostics_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_get_diagnostics` interceptor runs + before the `post_get_diagnostics_with_metadata` interceptor. """ return response + def post_get_diagnostics_with_metadata( + self, + response: compute.InterconnectsGetDiagnosticsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectsGetDiagnosticsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_diagnostics + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_get_diagnostics_with_metadata` + interceptor in new development instead of the `post_get_diagnostics` interceptor. + When both interceptors are used, this `post_get_diagnostics_with_metadata` interceptor runs after the + `post_get_diagnostics` interceptor. The (possibly modified) response returned by + `post_get_diagnostics` will be passed to + `post_get_diagnostics_with_metadata`. + """ + return response, metadata + def pre_get_macsec_config( self, request: compute.GetMacsecConfigInterconnectRequest, @@ -228,12 +300,38 @@ def post_get_macsec_config( ) -> compute.InterconnectsGetMacsecConfigResponse: """Post-rpc interceptor for get_macsec_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_macsec_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_get_macsec_config` interceptor runs + before the `post_get_macsec_config_with_metadata` interceptor. """ return response + def post_get_macsec_config_with_metadata( + self, + response: compute.InterconnectsGetMacsecConfigResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.InterconnectsGetMacsecConfigResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_macsec_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_get_macsec_config_with_metadata` + interceptor in new development instead of the `post_get_macsec_config` interceptor. + When both interceptors are used, this `post_get_macsec_config_with_metadata` interceptor runs after the + `post_get_macsec_config` interceptor. The (possibly modified) response returned by + `post_get_macsec_config` will be passed to + `post_get_macsec_config_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertInterconnectRequest, @@ -251,12 +349,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListInterconnectsRequest, @@ -274,12 +395,35 @@ def pre_list( def post_list(self, response: compute.InterconnectList) -> compute.InterconnectList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InterconnectList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InterconnectList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchInterconnectRequest, @@ -297,12 +441,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Interconnects server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Interconnects server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsInterconnectRequest, @@ -320,12 +487,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Interconnects 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Interconnects 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 + @dataclasses.dataclass class InterconnectsRestStub: @@ -555,6 +745,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -703,6 +897,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -847,6 +1043,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_diagnostics(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_diagnostics_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -995,6 +1195,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_macsec_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_macsec_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1164,6 +1368,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1308,6 +1516,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1475,6 +1685,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1646,6 +1860,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/client.py index 596f8823fbef..f4e152e434c6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/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 @@ -455,6 +457,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-compute/google/cloud/compute_v1/services/license_codes/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/transports/rest.py index 61a092695a7c..bf09ac178ed5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/license_codes/transports/rest.py @@ -105,12 +105,35 @@ def pre_get( def post_get(self, response: compute.LicenseCode) -> compute.LicenseCode: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LicenseCodes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.LicenseCode, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.LicenseCode, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LicenseCodes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsLicenseCodeRequest, @@ -131,12 +154,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 LicenseCodes 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 LicenseCodes 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 LicenseCodesRestStub: @@ -352,6 +400,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -502,6 +552,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-compute/google/cloud/compute_v1/services/licenses/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/client.py index 726d920c3163..f4d99b451603 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/licenses/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/transports/rest.py index c17b9f1fc1c2..d1806a48ced5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/licenses/transports/rest.py @@ -145,12 +145,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Licenses server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Licenses server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetLicenseRequest, @@ -166,12 +189,35 @@ def pre_get( def post_get(self, response: compute.License) -> compute.License: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Licenses server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.License, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.License, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Licenses server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyLicenseRequest, @@ -189,12 +235,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Licenses 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Licenses 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_insert( self, request: compute.InsertLicenseRequest, @@ -210,12 +279,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Licenses server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Licenses server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListLicensesRequest, @@ -233,12 +325,35 @@ def post_list( ) -> compute.LicensesListResponse: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Licenses server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.LicensesListResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.LicensesListResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Licenses server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyLicenseRequest, @@ -256,12 +371,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Licenses 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Licenses 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: compute.TestIamPermissionsLicenseRequest, @@ -282,12 +420,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Licenses 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Licenses 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 LicensesRestStub: @@ -515,6 +678,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -659,6 +826,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -826,6 +995,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 @@ -991,6 +1164,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1130,6 +1307,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1303,6 +1482,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 @@ -1453,6 +1636,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-compute/google/cloud/compute_v1/services/machine_images/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/client.py index 238bc73d5002..13d23b5ba7c8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/machine_images/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/transports/rest.py index 104e9f290c2f..62e9f64bc06e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_images/transports/rest.py @@ -147,12 +147,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineImages server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineImages server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetMachineImageRequest, @@ -168,12 +191,35 @@ def pre_get( def post_get(self, response: compute.MachineImage) -> compute.MachineImage: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineImages server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.MachineImage, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.MachineImage, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineImages server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyMachineImageRequest, @@ -191,12 +237,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 MachineImages 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 MachineImages 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_insert( self, request: compute.InsertMachineImageRequest, @@ -214,12 +283,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineImages server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineImages server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListMachineImagesRequest, @@ -237,12 +329,35 @@ def pre_list( def post_list(self, response: compute.MachineImageList) -> compute.MachineImageList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineImages server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.MachineImageList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.MachineImageList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineImages server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyMachineImageRequest, @@ -260,12 +375,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 MachineImages 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 MachineImages 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: compute.TestIamPermissionsMachineImageRequest, @@ -286,12 +424,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 MachineImages 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 MachineImages 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 MachineImagesRestStub: @@ -521,6 +684,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -671,6 +838,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -836,6 +1005,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 @@ -1003,6 +1176,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1145,6 +1322,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1316,6 +1495,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 @@ -1466,6 +1649,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-compute/google/cloud/compute_v1/services/machine_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/client.py index db82778e69d7..8c74e620f6fd 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/machine_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/transports/rest.py index c344ffdce171..e53284abeb52 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/machine_types/transports/rest.py @@ -118,12 +118,37 @@ def post_aggregated_list( ) -> compute.MachineTypeAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineTypes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.MachineTypeAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.MachineTypeAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineTypes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetMachineTypeRequest, @@ -139,12 +164,35 @@ def pre_get( def post_get(self, response: compute.MachineType) -> compute.MachineType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.MachineType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.MachineType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListMachineTypesRequest, @@ -162,12 +210,35 @@ def pre_list( def post_list(self, response: compute.MachineTypeList) -> compute.MachineTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the MachineTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.MachineTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.MachineTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the MachineTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class MachineTypesRestStub: @@ -378,6 +449,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -527,6 +602,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -669,6 +746,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/client.py index 7916d20e1543..eaff86efa694 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/network_attachments/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/transports/rest.py index 188a56103cd6..77f2e2cdef58 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_attachments/transports/rest.py @@ -166,12 +166,37 @@ def post_aggregated_list( ) -> compute.NetworkAttachmentAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NetworkAttachmentAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkAttachmentAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNetworkAttachmentRequest, @@ -189,12 +214,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNetworkAttachmentRequest, @@ -214,12 +262,35 @@ def post_get( ) -> compute.NetworkAttachment: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkAttachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkAttachment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyNetworkAttachmentRequest, @@ -238,12 +309,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 NetworkAttachments 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NetworkAttachments 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_insert( self, request: compute.InsertNetworkAttachmentRequest, @@ -261,12 +355,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNetworkAttachmentsRequest, @@ -286,12 +403,35 @@ def post_list( ) -> compute.NetworkAttachmentList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkAttachmentList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkAttachmentList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchNetworkAttachmentRequest, @@ -309,12 +449,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkAttachments server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkAttachments server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyNetworkAttachmentRequest, @@ -333,12 +496,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 NetworkAttachments 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NetworkAttachments 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: compute.TestIamPermissionsNetworkAttachmentRequest, @@ -359,12 +545,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 NetworkAttachments 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 NetworkAttachments 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 NetworkAttachmentsRestStub: @@ -578,6 +789,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -741,6 +956,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -889,6 +1108,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1055,6 +1276,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 @@ -1224,6 +1449,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1370,6 +1599,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1541,6 +1772,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1713,6 +1948,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 @@ -1866,6 +2105,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-compute/google/cloud/compute_v1/services/network_edge_security_services/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/client.py index fdcf09a73eb2..7016da9453c0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/network_edge_security_services/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/transports/rest.py index c2a28f890fb2..b0cc76feef10 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_edge_security_services/transports/rest.py @@ -134,12 +134,38 @@ def post_aggregated_list( ) -> compute.NetworkEdgeSecurityServiceAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEdgeSecurityServices server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NetworkEdgeSecurityServiceAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEdgeSecurityServiceAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEdgeSecurityServices server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNetworkEdgeSecurityServiceRequest, @@ -158,12 +184,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEdgeSecurityServices server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEdgeSecurityServices server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNetworkEdgeSecurityServiceRequest, @@ -184,12 +233,37 @@ def post_get( ) -> compute.NetworkEdgeSecurityService: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEdgeSecurityServices server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkEdgeSecurityService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEdgeSecurityService, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEdgeSecurityServices server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertNetworkEdgeSecurityServiceRequest, @@ -208,12 +282,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEdgeSecurityServices server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEdgeSecurityServices server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchNetworkEdgeSecurityServiceRequest, @@ -232,12 +329,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEdgeSecurityServices server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEdgeSecurityServices server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class NetworkEdgeSecurityServicesRestStub: @@ -453,6 +573,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -617,6 +741,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -762,6 +890,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -930,6 +1060,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1096,6 +1230,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/client.py index 0d91efec9d6a..c6383d546885 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/network_endpoint_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/transports/rest.py index 1f660c604392..0f9fb6c7fdfe 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_endpoint_groups/transports/rest.py @@ -166,12 +166,38 @@ def post_aggregated_list( ) -> compute.NetworkEndpointGroupAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NetworkEndpointGroupAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_attach_network_endpoints( self, request: compute.AttachNetworkEndpointsNetworkEndpointGroupRequest, @@ -192,12 +218,35 @@ def post_attach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for attach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_attach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_attach_network_endpoints` interceptor runs + before the `post_attach_network_endpoints_with_metadata` interceptor. """ return response + def post_attach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for attach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_attach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_attach_network_endpoints` interceptor. + When both interceptors are used, this `post_attach_network_endpoints_with_metadata` interceptor runs after the + `post_attach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_attach_network_endpoints` will be passed to + `post_attach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNetworkEndpointGroupRequest, @@ -216,12 +265,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_detach_network_endpoints( self, request: compute.DetachNetworkEndpointsNetworkEndpointGroupRequest, @@ -242,12 +314,35 @@ def post_detach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for detach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_detach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_detach_network_endpoints` interceptor runs + before the `post_detach_network_endpoints_with_metadata` interceptor. """ return response + def post_detach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for detach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_detach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_detach_network_endpoints` interceptor. + When both interceptors are used, this `post_detach_network_endpoints_with_metadata` interceptor runs after the + `post_detach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_detach_network_endpoints` will be passed to + `post_detach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNetworkEndpointGroupRequest, @@ -267,12 +362,35 @@ def post_get( ) -> compute.NetworkEndpointGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkEndpointGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkEndpointGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertNetworkEndpointGroupRequest, @@ -291,12 +409,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNetworkEndpointGroupsRequest, @@ -317,12 +458,37 @@ def post_list( ) -> compute.NetworkEndpointGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkEndpointGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_network_endpoints( self, request: compute.ListNetworkEndpointsNetworkEndpointGroupsRequest, @@ -343,12 +509,38 @@ def post_list_network_endpoints( ) -> compute.NetworkEndpointGroupsListNetworkEndpoints: """Post-rpc interceptor for list_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list_network_endpoints` interceptor runs + before the `post_list_network_endpoints_with_metadata` interceptor. """ return response + def post_list_network_endpoints_with_metadata( + self, + response: compute.NetworkEndpointGroupsListNetworkEndpoints, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupsListNetworkEndpoints, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_network_endpoints_with_metadata` + interceptor in new development instead of the `post_list_network_endpoints` interceptor. + When both interceptors are used, this `post_list_network_endpoints_with_metadata` interceptor runs after the + `post_list_network_endpoints` interceptor. The (possibly modified) response returned by + `post_list_network_endpoints` will be passed to + `post_list_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsNetworkEndpointGroupRequest, @@ -369,12 +561,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 NetworkEndpointGroups 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 NetworkEndpointGroups 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 NetworkEndpointGroupsRestStub: @@ -586,6 +803,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -756,6 +977,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_attach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_attach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -916,6 +1141,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1084,6 +1313,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_detach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_detach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1236,6 +1469,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1402,6 +1637,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1544,6 +1783,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1699,6 +1940,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1856,6 +2101,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-compute/google/cloud/compute_v1/services/network_firewall_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/client.py index df2bdb1b42c1..121fb8fcb00b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/network_firewall_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/transports/rest.py index 0857cf64a012..4f57cb9f55ff 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_firewall_policies/transports/rest.py @@ -228,12 +228,35 @@ def pre_add_association( def post_add_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_association` interceptor runs + before the `post_add_association_with_metadata` interceptor. """ return response + def post_add_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_association_with_metadata` + interceptor in new development instead of the `post_add_association` interceptor. + When both interceptors are used, this `post_add_association_with_metadata` interceptor runs after the + `post_add_association` interceptor. The (possibly modified) response returned by + `post_add_association` will be passed to + `post_add_association_with_metadata`. + """ + return response, metadata + def pre_add_rule( self, request: compute.AddRuleNetworkFirewallPolicyRequest, @@ -252,12 +275,35 @@ def pre_add_rule( def post_add_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_rule` interceptor runs + before the `post_add_rule_with_metadata` interceptor. """ return response + def post_add_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_rule_with_metadata` + interceptor in new development instead of the `post_add_rule` interceptor. + When both interceptors are used, this `post_add_rule_with_metadata` interceptor runs after the + `post_add_rule` interceptor. The (possibly modified) response returned by + `post_add_rule` will be passed to + `post_add_rule_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListNetworkFirewallPoliciesRequest, @@ -278,12 +324,38 @@ def post_aggregated_list( ) -> compute.NetworkFirewallPolicyAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NetworkFirewallPolicyAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkFirewallPolicyAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_clone_rules( self, request: compute.CloneRulesNetworkFirewallPolicyRequest, @@ -302,12 +374,35 @@ def pre_clone_rules( def post_clone_rules(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for clone_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_clone_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_clone_rules` interceptor runs + before the `post_clone_rules_with_metadata` interceptor. """ return response + def post_clone_rules_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for clone_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_clone_rules_with_metadata` + interceptor in new development instead of the `post_clone_rules` interceptor. + When both interceptors are used, this `post_clone_rules_with_metadata` interceptor runs after the + `post_clone_rules` interceptor. The (possibly modified) response returned by + `post_clone_rules` will be passed to + `post_clone_rules_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNetworkFirewallPolicyRequest, @@ -326,12 +421,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNetworkFirewallPolicyRequest, @@ -349,12 +467,35 @@ def pre_get( def post_get(self, response: compute.FirewallPolicy) -> compute.FirewallPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.FirewallPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_association( self, request: compute.GetAssociationNetworkFirewallPolicyRequest, @@ -375,12 +516,37 @@ def post_get_association( ) -> compute.FirewallPolicyAssociation: """Post-rpc interceptor for get_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_association` interceptor runs + before the `post_get_association_with_metadata` interceptor. """ return response + def post_get_association_with_metadata( + self, + response: compute.FirewallPolicyAssociation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.FirewallPolicyAssociation, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_association_with_metadata` + interceptor in new development instead of the `post_get_association` interceptor. + When both interceptors are used, this `post_get_association_with_metadata` interceptor runs after the + `post_get_association` interceptor. The (possibly modified) response returned by + `post_get_association` will be passed to + `post_get_association_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyNetworkFirewallPolicyRequest, @@ -399,12 +565,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 NetworkFirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NetworkFirewallPolicies 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_rule( self, request: compute.GetRuleNetworkFirewallPolicyRequest, @@ -425,12 +614,35 @@ def post_get_rule( ) -> compute.FirewallPolicyRule: """Post-rpc interceptor for get_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_rule` interceptor runs + before the `post_get_rule_with_metadata` interceptor. """ return response + def post_get_rule_with_metadata( + self, + response: compute.FirewallPolicyRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_rule_with_metadata` + interceptor in new development instead of the `post_get_rule` interceptor. + When both interceptors are used, this `post_get_rule_with_metadata` interceptor runs after the + `post_get_rule` interceptor. The (possibly modified) response returned by + `post_get_rule` will be passed to + `post_get_rule_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertNetworkFirewallPolicyRequest, @@ -449,12 +661,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNetworkFirewallPoliciesRequest, @@ -475,12 +710,35 @@ def post_list( ) -> compute.FirewallPolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.FirewallPolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchNetworkFirewallPolicyRequest, @@ -499,12 +757,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_rule( self, request: compute.PatchRuleNetworkFirewallPolicyRequest, @@ -523,12 +804,35 @@ def pre_patch_rule( def post_patch_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch_rule` interceptor runs + before the `post_patch_rule_with_metadata` interceptor. """ return response + def post_patch_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_rule_with_metadata` + interceptor in new development instead of the `post_patch_rule` interceptor. + When both interceptors are used, this `post_patch_rule_with_metadata` interceptor runs after the + `post_patch_rule` interceptor. The (possibly modified) response returned by + `post_patch_rule` will be passed to + `post_patch_rule_with_metadata`. + """ + return response, metadata + def pre_remove_association( self, request: compute.RemoveAssociationNetworkFirewallPolicyRequest, @@ -547,12 +851,35 @@ def pre_remove_association( def post_remove_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_association` interceptor runs + before the `post_remove_association_with_metadata` interceptor. """ return response + def post_remove_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_association_with_metadata` + interceptor in new development instead of the `post_remove_association` interceptor. + When both interceptors are used, this `post_remove_association_with_metadata` interceptor runs after the + `post_remove_association` interceptor. The (possibly modified) response returned by + `post_remove_association` will be passed to + `post_remove_association_with_metadata`. + """ + return response, metadata + def pre_remove_rule( self, request: compute.RemoveRuleNetworkFirewallPolicyRequest, @@ -571,12 +898,35 @@ def pre_remove_rule( def post_remove_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_rule` interceptor runs + before the `post_remove_rule_with_metadata` interceptor. """ return response + def post_remove_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_rule_with_metadata` + interceptor in new development instead of the `post_remove_rule` interceptor. + When both interceptors are used, this `post_remove_rule_with_metadata` interceptor runs after the + `post_remove_rule` interceptor. The (possibly modified) response returned by + `post_remove_rule` will be passed to + `post_remove_rule_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyNetworkFirewallPolicyRequest, @@ -595,12 +945,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 NetworkFirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NetworkFirewallPolicies 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: compute.TestIamPermissionsNetworkFirewallPolicyRequest, @@ -621,12 +994,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 NetworkFirewallPolicies 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 NetworkFirewallPolicies 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 NetworkFirewallPoliciesRestStub: @@ -863,6 +1261,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1029,6 +1431,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1174,6 +1580,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1336,6 +1746,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_clone_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_clone_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1496,6 +1910,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1641,6 +2059,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1786,6 +2206,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1954,6 +2378,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 @@ -2101,6 +2529,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2267,6 +2699,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2410,6 +2846,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2576,6 +3014,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2742,6 +3184,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2906,6 +3352,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3066,6 +3516,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3238,6 +3692,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 @@ -3391,6 +3849,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-compute/google/cloud/compute_v1/services/network_profiles/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/client.py index e50c56271b10..7108726baab9 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/network_profiles/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/transports/rest.py index b1b3f27cf9d6..bd377f0a1543 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/network_profiles/transports/rest.py @@ -107,12 +107,35 @@ def pre_get( def post_get(self, response: compute.NetworkProfile) -> compute.NetworkProfile: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkProfiles server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkProfile, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkProfile, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkProfiles server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNetworkProfilesRequest, @@ -132,12 +155,37 @@ def post_list( ) -> compute.NetworkProfilesListResponse: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NetworkProfiles server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkProfilesListResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkProfilesListResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NetworkProfiles server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class NetworkProfilesRestStub: @@ -352,6 +400,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -496,6 +546,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/client.py index ac1d43bd8c92..b41e24682ebb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/networks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/transports/rest.py index db29bebbf255..a148446c9b53 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/networks/transports/rest.py @@ -179,12 +179,35 @@ def pre_add_peering( def post_add_peering(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_peering - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_peering_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_add_peering` interceptor runs + before the `post_add_peering_with_metadata` interceptor. """ return response + def post_add_peering_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_peering + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_add_peering_with_metadata` + interceptor in new development instead of the `post_add_peering` interceptor. + When both interceptors are used, this `post_add_peering_with_metadata` interceptor runs after the + `post_add_peering` interceptor. The (possibly modified) response returned by + `post_add_peering` will be passed to + `post_add_peering_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNetworkRequest, @@ -200,12 +223,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNetworkRequest, @@ -221,12 +267,35 @@ def pre_get( def post_get(self, response: compute.Network) -> compute.Network: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Network, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Network, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_effective_firewalls( self, request: compute.GetEffectiveFirewallsNetworkRequest, @@ -247,12 +316,38 @@ def post_get_effective_firewalls( ) -> compute.NetworksGetEffectiveFirewallsResponse: """Post-rpc interceptor for get_effective_firewalls - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_firewalls_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_firewalls` interceptor runs + before the `post_get_effective_firewalls_with_metadata` interceptor. """ return response + def post_get_effective_firewalls_with_metadata( + self, + response: compute.NetworksGetEffectiveFirewallsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworksGetEffectiveFirewallsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_firewalls + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_get_effective_firewalls_with_metadata` + interceptor in new development instead of the `post_get_effective_firewalls` interceptor. + When both interceptors are used, this `post_get_effective_firewalls_with_metadata` interceptor runs after the + `post_get_effective_firewalls` interceptor. The (possibly modified) response returned by + `post_get_effective_firewalls` will be passed to + `post_get_effective_firewalls_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertNetworkRequest, @@ -268,12 +363,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNetworksRequest, @@ -289,12 +407,35 @@ def pre_list( def post_list(self, response: compute.NetworkList) -> compute.NetworkList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_peering_routes( self, request: compute.ListPeeringRoutesNetworksRequest, @@ -315,12 +456,37 @@ def post_list_peering_routes( ) -> compute.ExchangedPeeringRoutesList: """Post-rpc interceptor for list_peering_routes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_peering_routes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_list_peering_routes` interceptor runs + before the `post_list_peering_routes_with_metadata` interceptor. """ return response + def post_list_peering_routes_with_metadata( + self, + response: compute.ExchangedPeeringRoutesList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ExchangedPeeringRoutesList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_peering_routes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_list_peering_routes_with_metadata` + interceptor in new development instead of the `post_list_peering_routes` interceptor. + When both interceptors are used, this `post_list_peering_routes_with_metadata` interceptor runs after the + `post_list_peering_routes` interceptor. The (possibly modified) response returned by + `post_list_peering_routes` will be passed to + `post_list_peering_routes_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchNetworkRequest, @@ -336,12 +502,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_remove_peering( self, request: compute.RemovePeeringNetworkRequest, @@ -359,12 +548,35 @@ def pre_remove_peering( def post_remove_peering(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_peering - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_peering_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_remove_peering` interceptor runs + before the `post_remove_peering_with_metadata` interceptor. """ return response + def post_remove_peering_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_peering + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_remove_peering_with_metadata` + interceptor in new development instead of the `post_remove_peering` interceptor. + When both interceptors are used, this `post_remove_peering_with_metadata` interceptor runs after the + `post_remove_peering` interceptor. The (possibly modified) response returned by + `post_remove_peering` will be passed to + `post_remove_peering_with_metadata`. + """ + return response, metadata + def pre_switch_to_custom_mode( self, request: compute.SwitchToCustomModeNetworkRequest, @@ -385,12 +597,35 @@ def post_switch_to_custom_mode( ) -> compute.Operation: """Post-rpc interceptor for switch_to_custom_mode - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_switch_to_custom_mode_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_switch_to_custom_mode` interceptor runs + before the `post_switch_to_custom_mode_with_metadata` interceptor. """ return response + def post_switch_to_custom_mode_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for switch_to_custom_mode + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_switch_to_custom_mode_with_metadata` + interceptor in new development instead of the `post_switch_to_custom_mode` interceptor. + When both interceptors are used, this `post_switch_to_custom_mode_with_metadata` interceptor runs after the + `post_switch_to_custom_mode` interceptor. The (possibly modified) response returned by + `post_switch_to_custom_mode` will be passed to + `post_switch_to_custom_mode_with_metadata`. + """ + return response, metadata + def pre_update_peering( self, request: compute.UpdatePeeringNetworkRequest, @@ -408,12 +643,35 @@ def pre_update_peering( def post_update_peering(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update_peering - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_peering_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Networks server but before - it is returned to user code. + it is returned to user code. This `post_update_peering` interceptor runs + before the `post_update_peering_with_metadata` interceptor. """ return response + def post_update_peering_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_peering + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Networks server but before it is returned to user code. + + We recommend only using this `post_update_peering_with_metadata` + interceptor in new development instead of the `post_update_peering` interceptor. + When both interceptors are used, this `post_update_peering_with_metadata` interceptor runs after the + `post_update_peering` interceptor. The (possibly modified) response returned by + `post_update_peering` will be passed to + `post_update_peering_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class NetworksRestStub: @@ -649,6 +907,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_peering(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_peering_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -808,6 +1070,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -952,6 +1218,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1096,6 +1364,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_effective_firewalls(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_effective_firewalls_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1263,6 +1535,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1402,6 +1678,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1546,6 +1824,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_peering_routes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_peering_routes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1710,6 +1992,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1879,6 +2165,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_peering(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_peering_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2040,6 +2330,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_switch_to_custom_mode(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_switch_to_custom_mode_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2209,6 +2503,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_peering(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_peering_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/client.py index 6e92e2cec2b2..64a04da2c980 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/node_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/transports/rest.py index 39570a632dcc..603e72bd487e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_groups/transports/rest.py @@ -211,12 +211,35 @@ def pre_add_nodes( def post_add_nodes(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_nodes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_nodes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_add_nodes` interceptor runs + before the `post_add_nodes_with_metadata` interceptor. """ return response + def post_add_nodes_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_nodes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_add_nodes_with_metadata` + interceptor in new development instead of the `post_add_nodes` interceptor. + When both interceptors are used, this `post_add_nodes_with_metadata` interceptor runs after the + `post_add_nodes` interceptor. The (possibly modified) response returned by + `post_add_nodes` will be passed to + `post_add_nodes_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListNodeGroupsRequest, @@ -236,12 +259,37 @@ def post_aggregated_list( ) -> compute.NodeGroupAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NodeGroupAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NodeGroupAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNodeGroupRequest, @@ -257,12 +305,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_nodes( self, request: compute.DeleteNodesNodeGroupRequest, @@ -280,12 +351,35 @@ def pre_delete_nodes( def post_delete_nodes(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete_nodes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_nodes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete_nodes` interceptor runs + before the `post_delete_nodes_with_metadata` interceptor. """ return response + def post_delete_nodes_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_nodes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_delete_nodes_with_metadata` + interceptor in new development instead of the `post_delete_nodes` interceptor. + When both interceptors are used, this `post_delete_nodes_with_metadata` interceptor runs after the + `post_delete_nodes` interceptor. The (possibly modified) response returned by + `post_delete_nodes` will be passed to + `post_delete_nodes_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNodeGroupRequest, @@ -301,12 +395,35 @@ def pre_get( def post_get(self, response: compute.NodeGroup) -> compute.NodeGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NodeGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyNodeGroupRequest, @@ -324,12 +441,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 NodeGroups 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NodeGroups 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_insert( self, request: compute.InsertNodeGroupRequest, @@ -345,12 +485,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNodeGroupsRequest, @@ -366,12 +529,35 @@ def pre_list( def post_list(self, response: compute.NodeGroupList) -> compute.NodeGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NodeGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeGroupList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_nodes( self, request: compute.ListNodesNodeGroupsRequest, @@ -391,12 +577,35 @@ def post_list_nodes( ) -> compute.NodeGroupsListNodes: """Post-rpc interceptor for list_nodes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_nodes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_list_nodes` interceptor runs + before the `post_list_nodes_with_metadata` interceptor. """ return response + def post_list_nodes_with_metadata( + self, + response: compute.NodeGroupsListNodes, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeGroupsListNodes, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_nodes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_list_nodes_with_metadata` + interceptor in new development instead of the `post_list_nodes` interceptor. + When both interceptors are used, this `post_list_nodes_with_metadata` interceptor runs after the + `post_list_nodes` interceptor. The (possibly modified) response returned by + `post_list_nodes` will be passed to + `post_list_nodes_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchNodeGroupRequest, @@ -412,12 +621,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_perform_maintenance( self, request: compute.PerformMaintenanceNodeGroupRequest, @@ -438,12 +670,35 @@ def post_perform_maintenance( ) -> compute.Operation: """Post-rpc interceptor for perform_maintenance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_perform_maintenance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_perform_maintenance` interceptor runs + before the `post_perform_maintenance_with_metadata` interceptor. """ return response + def post_perform_maintenance_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for perform_maintenance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_perform_maintenance_with_metadata` + interceptor in new development instead of the `post_perform_maintenance` interceptor. + When both interceptors are used, this `post_perform_maintenance_with_metadata` interceptor runs after the + `post_perform_maintenance` interceptor. The (possibly modified) response returned by + `post_perform_maintenance` will be passed to + `post_perform_maintenance_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyNodeGroupRequest, @@ -461,12 +716,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 NodeGroups 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NodeGroups 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_set_node_template( self, request: compute.SetNodeTemplateNodeGroupRequest, @@ -484,12 +762,35 @@ def pre_set_node_template( def post_set_node_template(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_node_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_node_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_set_node_template` interceptor runs + before the `post_set_node_template_with_metadata` interceptor. """ return response + def post_set_node_template_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_node_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_set_node_template_with_metadata` + interceptor in new development instead of the `post_set_node_template` interceptor. + When both interceptors are used, this `post_set_node_template_with_metadata` interceptor runs after the + `post_set_node_template` interceptor. The (possibly modified) response returned by + `post_set_node_template` will be passed to + `post_set_node_template_with_metadata`. + """ + return response, metadata + def pre_simulate_maintenance_event( self, request: compute.SimulateMaintenanceEventNodeGroupRequest, @@ -510,12 +811,35 @@ def post_simulate_maintenance_event( ) -> compute.Operation: """Post-rpc interceptor for simulate_maintenance_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_simulate_maintenance_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeGroups server but before - it is returned to user code. + it is returned to user code. This `post_simulate_maintenance_event` interceptor runs + before the `post_simulate_maintenance_event_with_metadata` interceptor. """ return response + def post_simulate_maintenance_event_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for simulate_maintenance_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeGroups server but before it is returned to user code. + + We recommend only using this `post_simulate_maintenance_event_with_metadata` + interceptor in new development instead of the `post_simulate_maintenance_event` interceptor. + When both interceptors are used, this `post_simulate_maintenance_event_with_metadata` interceptor runs after the + `post_simulate_maintenance_event` interceptor. The (possibly modified) response returned by + `post_simulate_maintenance_event` will be passed to + `post_simulate_maintenance_event_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsNodeGroupRequest, @@ -536,12 +860,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 NodeGroups 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 NodeGroups 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 NodeGroupsRestStub: @@ -777,6 +1126,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_nodes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_nodes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -921,6 +1274,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1080,6 +1437,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1249,6 +1610,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_nodes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_nodes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1399,6 +1764,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1568,6 +1935,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 @@ -1733,6 +2104,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1875,6 +2250,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2019,6 +2396,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_nodes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_nodes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2184,6 +2565,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2351,6 +2736,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_perform_maintenance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_perform_maintenance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2528,6 +2917,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 @@ -2695,6 +3088,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_node_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_node_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2863,6 +3260,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_simulate_maintenance_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_simulate_maintenance_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3013,6 +3414,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-compute/google/cloud/compute_v1/services/node_templates/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/client.py index cc827787a1af..bfba7aa0d505 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/node_templates/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/transports/rest.py index dc3693828142..1a67b0ce6868 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_templates/transports/rest.py @@ -158,12 +158,37 @@ def post_aggregated_list( ) -> compute.NodeTemplateAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTemplates server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NodeTemplateAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NodeTemplateAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTemplates server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteNodeTemplateRequest, @@ -181,12 +206,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTemplates server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTemplates server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNodeTemplateRequest, @@ -202,12 +250,35 @@ def pre_get( def post_get(self, response: compute.NodeTemplate) -> compute.NodeTemplate: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTemplates server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NodeTemplate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeTemplate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTemplates server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyNodeTemplateRequest, @@ -225,12 +296,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 NodeTemplates 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NodeTemplates 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_insert( self, request: compute.InsertNodeTemplateRequest, @@ -248,12 +342,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTemplates server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTemplates server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNodeTemplatesRequest, @@ -271,12 +388,35 @@ def pre_list( def post_list(self, response: compute.NodeTemplateList) -> compute.NodeTemplateList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTemplates server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NodeTemplateList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeTemplateList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTemplates server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyNodeTemplateRequest, @@ -294,12 +434,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 NodeTemplates 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 NodeTemplates 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: compute.TestIamPermissionsNodeTemplateRequest, @@ -320,12 +483,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 NodeTemplates 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 NodeTemplates 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 NodeTemplatesRestStub: @@ -536,6 +724,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -699,6 +891,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -846,6 +1042,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1011,6 +1209,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 @@ -1178,6 +1380,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1320,6 +1526,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1491,6 +1699,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 @@ -1641,6 +1853,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-compute/google/cloud/compute_v1/services/node_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/client.py index 9b793fe99729..d60d01771db2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/node_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/transports/rest.py index 823084a79601..e94f3483882e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/node_types/transports/rest.py @@ -117,12 +117,35 @@ def post_aggregated_list( ) -> compute.NodeTypeAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTypes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.NodeTypeAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeTypeAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTypes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetNodeTypeRequest, @@ -138,12 +161,35 @@ def pre_get( def post_get(self, response: compute.NodeType) -> compute.NodeType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NodeType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListNodeTypesRequest, @@ -159,12 +205,35 @@ def pre_list( def post_list(self, response: compute.NodeTypeList) -> compute.NodeTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the NodeTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NodeTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NodeTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the NodeTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class NodeTypesRestStub: @@ -379,6 +448,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -528,6 +601,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -667,6 +742,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/client.py index da159c1bedb7..d0d959792da0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/packet_mirrorings/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/transports/rest.py index 82ba73f64e3c..fc5c73fb3b3d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/packet_mirrorings/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.PacketMirroringAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.PacketMirroringAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.PacketMirroringAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeletePacketMirroringRequest, @@ -173,12 +198,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetPacketMirroringRequest, @@ -196,12 +244,35 @@ def pre_get( def post_get(self, response: compute.PacketMirroring) -> compute.PacketMirroring: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.PacketMirroring, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.PacketMirroring, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertPacketMirroringRequest, @@ -219,12 +290,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListPacketMirroringsRequest, @@ -244,12 +338,35 @@ def post_list( ) -> compute.PacketMirroringList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.PacketMirroringList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.PacketMirroringList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchPacketMirroringRequest, @@ -267,12 +384,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PacketMirrorings server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PacketMirrorings server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsPacketMirroringRequest, @@ -293,12 +433,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 PacketMirrorings 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 PacketMirrorings 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 PacketMirroringsRestStub: @@ -509,6 +674,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -674,6 +843,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -828,6 +1001,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -999,6 +1174,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1145,6 +1324,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1314,6 +1495,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1465,6 +1650,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-compute/google/cloud/compute_v1/services/projects/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/client.py index be5a0c35b7ce..0b8a45f44c5b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/projects/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/transports/rest.py index fb2d094618c1..b5ed0b87b6a8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/projects/transports/rest.py @@ -203,12 +203,35 @@ def pre_disable_xpn_host( def post_disable_xpn_host(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for disable_xpn_host - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_xpn_host_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_disable_xpn_host` interceptor runs + before the `post_disable_xpn_host_with_metadata` interceptor. """ return response + def post_disable_xpn_host_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_xpn_host + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_disable_xpn_host_with_metadata` + interceptor in new development instead of the `post_disable_xpn_host` interceptor. + When both interceptors are used, this `post_disable_xpn_host_with_metadata` interceptor runs after the + `post_disable_xpn_host` interceptor. The (possibly modified) response returned by + `post_disable_xpn_host` will be passed to + `post_disable_xpn_host_with_metadata`. + """ + return response, metadata + def pre_disable_xpn_resource( self, request: compute.DisableXpnResourceProjectRequest, @@ -229,12 +252,35 @@ def post_disable_xpn_resource( ) -> compute.Operation: """Post-rpc interceptor for disable_xpn_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_xpn_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_disable_xpn_resource` interceptor runs + before the `post_disable_xpn_resource_with_metadata` interceptor. """ return response + def post_disable_xpn_resource_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_xpn_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_disable_xpn_resource_with_metadata` + interceptor in new development instead of the `post_disable_xpn_resource` interceptor. + When both interceptors are used, this `post_disable_xpn_resource_with_metadata` interceptor runs after the + `post_disable_xpn_resource` interceptor. The (possibly modified) response returned by + `post_disable_xpn_resource` will be passed to + `post_disable_xpn_resource_with_metadata`. + """ + return response, metadata + def pre_enable_xpn_host( self, request: compute.EnableXpnHostProjectRequest, @@ -252,12 +298,35 @@ def pre_enable_xpn_host( def post_enable_xpn_host(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for enable_xpn_host - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_xpn_host_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_enable_xpn_host` interceptor runs + before the `post_enable_xpn_host_with_metadata` interceptor. """ return response + def post_enable_xpn_host_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_xpn_host + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_enable_xpn_host_with_metadata` + interceptor in new development instead of the `post_enable_xpn_host` interceptor. + When both interceptors are used, this `post_enable_xpn_host_with_metadata` interceptor runs after the + `post_enable_xpn_host` interceptor. The (possibly modified) response returned by + `post_enable_xpn_host` will be passed to + `post_enable_xpn_host_with_metadata`. + """ + return response, metadata + def pre_enable_xpn_resource( self, request: compute.EnableXpnResourceProjectRequest, @@ -277,12 +346,35 @@ def post_enable_xpn_resource( ) -> compute.Operation: """Post-rpc interceptor for enable_xpn_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_xpn_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_enable_xpn_resource` interceptor runs + before the `post_enable_xpn_resource_with_metadata` interceptor. """ return response + def post_enable_xpn_resource_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_xpn_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_enable_xpn_resource_with_metadata` + interceptor in new development instead of the `post_enable_xpn_resource` interceptor. + When both interceptors are used, this `post_enable_xpn_resource_with_metadata` interceptor runs after the + `post_enable_xpn_resource` interceptor. The (possibly modified) response returned by + `post_enable_xpn_resource` will be passed to + `post_enable_xpn_resource_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetProjectRequest, @@ -298,12 +390,35 @@ def pre_get( def post_get(self, response: compute.Project) -> compute.Project: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Project, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Project, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_xpn_host( self, request: compute.GetXpnHostProjectRequest, @@ -321,12 +436,35 @@ def pre_get_xpn_host( def post_get_xpn_host(self, response: compute.Project) -> compute.Project: """Post-rpc interceptor for get_xpn_host - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_xpn_host_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_get_xpn_host` interceptor runs + before the `post_get_xpn_host_with_metadata` interceptor. """ return response + def post_get_xpn_host_with_metadata( + self, + response: compute.Project, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Project, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_xpn_host + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_get_xpn_host_with_metadata` + interceptor in new development instead of the `post_get_xpn_host` interceptor. + When both interceptors are used, this `post_get_xpn_host_with_metadata` interceptor runs after the + `post_get_xpn_host` interceptor. The (possibly modified) response returned by + `post_get_xpn_host` will be passed to + `post_get_xpn_host_with_metadata`. + """ + return response, metadata + def pre_get_xpn_resources( self, request: compute.GetXpnResourcesProjectsRequest, @@ -346,12 +484,37 @@ def post_get_xpn_resources( ) -> compute.ProjectsGetXpnResources: """Post-rpc interceptor for get_xpn_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_xpn_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_get_xpn_resources` interceptor runs + before the `post_get_xpn_resources_with_metadata` interceptor. """ return response + def post_get_xpn_resources_with_metadata( + self, + response: compute.ProjectsGetXpnResources, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ProjectsGetXpnResources, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_xpn_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_get_xpn_resources_with_metadata` + interceptor in new development instead of the `post_get_xpn_resources` interceptor. + When both interceptors are used, this `post_get_xpn_resources_with_metadata` interceptor runs after the + `post_get_xpn_resources` interceptor. The (possibly modified) response returned by + `post_get_xpn_resources` will be passed to + `post_get_xpn_resources_with_metadata`. + """ + return response, metadata + def pre_list_xpn_hosts( self, request: compute.ListXpnHostsProjectsRequest, @@ -369,12 +532,35 @@ def pre_list_xpn_hosts( def post_list_xpn_hosts(self, response: compute.XpnHostList) -> compute.XpnHostList: """Post-rpc interceptor for list_xpn_hosts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_xpn_hosts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_list_xpn_hosts` interceptor runs + before the `post_list_xpn_hosts_with_metadata` interceptor. """ return response + def post_list_xpn_hosts_with_metadata( + self, + response: compute.XpnHostList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.XpnHostList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_xpn_hosts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_list_xpn_hosts_with_metadata` + interceptor in new development instead of the `post_list_xpn_hosts` interceptor. + When both interceptors are used, this `post_list_xpn_hosts_with_metadata` interceptor runs after the + `post_list_xpn_hosts` interceptor. The (possibly modified) response returned by + `post_list_xpn_hosts` will be passed to + `post_list_xpn_hosts_with_metadata`. + """ + return response, metadata + def pre_move_disk( self, request: compute.MoveDiskProjectRequest, @@ -390,12 +576,35 @@ def pre_move_disk( def post_move_disk(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for move_disk - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_disk_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_move_disk` interceptor runs + before the `post_move_disk_with_metadata` interceptor. """ return response + def post_move_disk_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_disk + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_move_disk_with_metadata` + interceptor in new development instead of the `post_move_disk` interceptor. + When both interceptors are used, this `post_move_disk_with_metadata` interceptor runs after the + `post_move_disk` interceptor. The (possibly modified) response returned by + `post_move_disk` will be passed to + `post_move_disk_with_metadata`. + """ + return response, metadata + def pre_move_instance( self, request: compute.MoveInstanceProjectRequest, @@ -413,12 +622,35 @@ def pre_move_instance( def post_move_instance(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for move_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_move_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_move_instance` interceptor runs + before the `post_move_instance_with_metadata` interceptor. """ return response + def post_move_instance_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for move_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_move_instance_with_metadata` + interceptor in new development instead of the `post_move_instance` interceptor. + When both interceptors are used, this `post_move_instance_with_metadata` interceptor runs after the + `post_move_instance` interceptor. The (possibly modified) response returned by + `post_move_instance` will be passed to + `post_move_instance_with_metadata`. + """ + return response, metadata + def pre_set_cloud_armor_tier( self, request: compute.SetCloudArmorTierProjectRequest, @@ -438,12 +670,35 @@ def post_set_cloud_armor_tier( ) -> compute.Operation: """Post-rpc interceptor for set_cloud_armor_tier - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_cloud_armor_tier_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_set_cloud_armor_tier` interceptor runs + before the `post_set_cloud_armor_tier_with_metadata` interceptor. """ return response + def post_set_cloud_armor_tier_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_cloud_armor_tier + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_set_cloud_armor_tier_with_metadata` + interceptor in new development instead of the `post_set_cloud_armor_tier` interceptor. + When both interceptors are used, this `post_set_cloud_armor_tier_with_metadata` interceptor runs after the + `post_set_cloud_armor_tier` interceptor. The (possibly modified) response returned by + `post_set_cloud_armor_tier` will be passed to + `post_set_cloud_armor_tier_with_metadata`. + """ + return response, metadata + def pre_set_common_instance_metadata( self, request: compute.SetCommonInstanceMetadataProjectRequest, @@ -464,12 +719,35 @@ def post_set_common_instance_metadata( ) -> compute.Operation: """Post-rpc interceptor for set_common_instance_metadata - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_common_instance_metadata_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_set_common_instance_metadata` interceptor runs + before the `post_set_common_instance_metadata_with_metadata` interceptor. """ return response + def post_set_common_instance_metadata_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_common_instance_metadata + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_set_common_instance_metadata_with_metadata` + interceptor in new development instead of the `post_set_common_instance_metadata` interceptor. + When both interceptors are used, this `post_set_common_instance_metadata_with_metadata` interceptor runs after the + `post_set_common_instance_metadata` interceptor. The (possibly modified) response returned by + `post_set_common_instance_metadata` will be passed to + `post_set_common_instance_metadata_with_metadata`. + """ + return response, metadata + def pre_set_default_network_tier( self, request: compute.SetDefaultNetworkTierProjectRequest, @@ -490,12 +768,35 @@ def post_set_default_network_tier( ) -> compute.Operation: """Post-rpc interceptor for set_default_network_tier - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_default_network_tier_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_set_default_network_tier` interceptor runs + before the `post_set_default_network_tier_with_metadata` interceptor. """ return response + def post_set_default_network_tier_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_default_network_tier + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_set_default_network_tier_with_metadata` + interceptor in new development instead of the `post_set_default_network_tier` interceptor. + When both interceptors are used, this `post_set_default_network_tier_with_metadata` interceptor runs after the + `post_set_default_network_tier` interceptor. The (possibly modified) response returned by + `post_set_default_network_tier` will be passed to + `post_set_default_network_tier_with_metadata`. + """ + return response, metadata + def pre_set_usage_export_bucket( self, request: compute.SetUsageExportBucketProjectRequest, @@ -516,12 +817,35 @@ def post_set_usage_export_bucket( ) -> compute.Operation: """Post-rpc interceptor for set_usage_export_bucket - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_usage_export_bucket_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Projects server but before - it is returned to user code. + it is returned to user code. This `post_set_usage_export_bucket` interceptor runs + before the `post_set_usage_export_bucket_with_metadata` interceptor. """ return response + def post_set_usage_export_bucket_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_usage_export_bucket + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Projects server but before it is returned to user code. + + We recommend only using this `post_set_usage_export_bucket_with_metadata` + interceptor in new development instead of the `post_set_usage_export_bucket` interceptor. + When both interceptors are used, this `post_set_usage_export_bucket_with_metadata` interceptor runs after the + `post_set_usage_export_bucket` interceptor. The (possibly modified) response returned by + `post_set_usage_export_bucket` will be passed to + `post_set_usage_export_bucket_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ProjectsRestStub: @@ -755,6 +1079,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_xpn_host(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_xpn_host_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -922,6 +1250,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_xpn_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_xpn_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1085,6 +1417,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_xpn_host(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_xpn_host_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1252,6 +1588,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_xpn_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_xpn_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1396,6 +1736,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1545,6 +1887,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_xpn_host(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_xpn_host_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1693,6 +2039,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_xpn_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_xpn_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1843,6 +2193,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_xpn_hosts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_xpn_hosts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2008,6 +2362,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_disk(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_disk_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2175,6 +2533,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_move_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_move_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2342,6 +2704,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_cloud_armor_tier(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_cloud_armor_tier_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2510,6 +2876,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_common_instance_metadata(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_common_instance_metadata_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2677,6 +3047,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_default_network_tier(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_default_network_tier_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2844,6 +3218,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_usage_export_bucket(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_usage_export_bucket_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/client.py index e9ee9d2de359..0c995165e3e0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/public_advertised_prefixes/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/transports/rest.py index e056f1431a12..5e0c73d04b46 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_advertised_prefixes/transports/rest.py @@ -148,12 +148,35 @@ def pre_announce( def post_announce(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for announce - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_announce_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_announce` interceptor runs + before the `post_announce_with_metadata` interceptor. """ return response + def post_announce_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for announce + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_announce_with_metadata` + interceptor in new development instead of the `post_announce` interceptor. + When both interceptors are used, this `post_announce_with_metadata` interceptor runs after the + `post_announce` interceptor. The (possibly modified) response returned by + `post_announce` will be passed to + `post_announce_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeletePublicAdvertisedPrefixeRequest, @@ -172,12 +195,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetPublicAdvertisedPrefixeRequest, @@ -198,12 +244,35 @@ def post_get( ) -> compute.PublicAdvertisedPrefix: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.PublicAdvertisedPrefix, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.PublicAdvertisedPrefix, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertPublicAdvertisedPrefixeRequest, @@ -222,12 +291,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListPublicAdvertisedPrefixesRequest, @@ -248,12 +340,37 @@ def post_list( ) -> compute.PublicAdvertisedPrefixList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.PublicAdvertisedPrefixList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.PublicAdvertisedPrefixList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchPublicAdvertisedPrefixeRequest, @@ -272,12 +389,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_withdraw( self, request: compute.WithdrawPublicAdvertisedPrefixeRequest, @@ -296,12 +436,35 @@ def pre_withdraw( def post_withdraw(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for withdraw - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_withdraw_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicAdvertisedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_withdraw` interceptor runs + before the `post_withdraw_with_metadata` interceptor. """ return response + def post_withdraw_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for withdraw + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicAdvertisedPrefixes server but before it is returned to user code. + + We recommend only using this `post_withdraw_with_metadata` + interceptor in new development instead of the `post_withdraw` interceptor. + When both interceptors are used, this `post_withdraw_with_metadata` interceptor runs after the + `post_withdraw` interceptor. The (possibly modified) response returned by + `post_withdraw` will be passed to + `post_withdraw_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class PublicAdvertisedPrefixesRestStub: @@ -530,6 +693,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_announce(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_announce_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -690,6 +857,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -839,6 +1010,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1005,6 +1178,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1148,6 +1325,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1316,6 +1495,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1476,6 +1659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_withdraw(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_withdraw_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/client.py index 1a5913c2719c..d587480818a6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/public_delegated_prefixes/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/transports/rest.py index 03d6adfe820d..47183b0ec8ad 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/public_delegated_prefixes/transports/rest.py @@ -158,12 +158,38 @@ def post_aggregated_list( ) -> compute.PublicDelegatedPrefixAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.PublicDelegatedPrefixAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.PublicDelegatedPrefixAggregatedList, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_announce( self, request: compute.AnnouncePublicDelegatedPrefixeRequest, @@ -182,12 +208,35 @@ def pre_announce( def post_announce(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for announce - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_announce_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_announce` interceptor runs + before the `post_announce_with_metadata` interceptor. """ return response + def post_announce_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for announce + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_announce_with_metadata` + interceptor in new development instead of the `post_announce` interceptor. + When both interceptors are used, this `post_announce_with_metadata` interceptor runs after the + `post_announce` interceptor. The (possibly modified) response returned by + `post_announce` will be passed to + `post_announce_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeletePublicDelegatedPrefixeRequest, @@ -206,12 +255,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetPublicDelegatedPrefixeRequest, @@ -232,12 +304,35 @@ def post_get( ) -> compute.PublicDelegatedPrefix: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.PublicDelegatedPrefix, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.PublicDelegatedPrefix, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertPublicDelegatedPrefixeRequest, @@ -256,12 +351,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListPublicDelegatedPrefixesRequest, @@ -282,12 +400,37 @@ def post_list( ) -> compute.PublicDelegatedPrefixList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.PublicDelegatedPrefixList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.PublicDelegatedPrefixList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchPublicDelegatedPrefixeRequest, @@ -306,12 +449,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_withdraw( self, request: compute.WithdrawPublicDelegatedPrefixeRequest, @@ -330,12 +496,35 @@ def pre_withdraw( def post_withdraw(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for withdraw - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_withdraw_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the PublicDelegatedPrefixes server but before - it is returned to user code. + it is returned to user code. This `post_withdraw` interceptor runs + before the `post_withdraw_with_metadata` interceptor. """ return response + def post_withdraw_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for withdraw + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the PublicDelegatedPrefixes server but before it is returned to user code. + + We recommend only using this `post_withdraw_with_metadata` + interceptor in new development instead of the `post_withdraw` interceptor. + When both interceptors are used, this `post_withdraw_with_metadata` interceptor runs after the + `post_withdraw` interceptor. The (possibly modified) response returned by + `post_withdraw` will be passed to + `post_withdraw_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class PublicDelegatedPrefixesRestStub: @@ -549,6 +738,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -711,6 +904,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_announce(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_announce_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -871,6 +1068,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1023,6 +1224,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1189,6 +1392,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1332,6 +1539,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1500,6 +1709,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1660,6 +1873,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_withdraw(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_withdraw_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/client.py index cb07e86ba4b4..0fc0935e5902 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_autoscalers/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/transports/rest.py index f385074fb135..7953511730d6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_autoscalers/transports/rest.py @@ -139,12 +139,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionAutoscalerRequest, @@ -162,12 +185,35 @@ def pre_get( def post_get(self, response: compute.Autoscaler) -> compute.Autoscaler: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Autoscaler, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Autoscaler, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionAutoscalerRequest, @@ -185,12 +231,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionAutoscalersRequest, @@ -210,12 +279,35 @@ def post_list( ) -> compute.RegionAutoscalerList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RegionAutoscalerList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RegionAutoscalerList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionAutoscalerRequest, @@ -233,12 +325,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateRegionAutoscalerRequest, @@ -256,12 +371,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionAutoscalers server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionAutoscalers server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionAutoscalersRestStub: @@ -493,6 +631,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -649,6 +791,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -820,6 +964,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -966,6 +1114,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1137,6 +1287,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1308,6 +1462,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/client.py index 8df5d123fc61..272a151d5a2f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_backend_services/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/transports/rest.py index 4ad5008ff3a5..3d98fc4f4aa2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_backend_services/transports/rest.py @@ -188,12 +188,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionBackendServiceRequest, @@ -211,12 +234,35 @@ def pre_get( def post_get(self, response: compute.BackendService) -> compute.BackendService: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.BackendService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendService, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_health( self, request: compute.GetHealthRegionBackendServiceRequest, @@ -237,12 +283,37 @@ def post_get_health( ) -> compute.BackendServiceGroupHealth: """Post-rpc interceptor for get_health - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_health_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_get_health` interceptor runs + before the `post_get_health_with_metadata` interceptor. """ return response + def post_get_health_with_metadata( + self, + response: compute.BackendServiceGroupHealth, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.BackendServiceGroupHealth, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_health + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_get_health_with_metadata` + interceptor in new development instead of the `post_get_health` interceptor. + When both interceptors are used, this `post_get_health_with_metadata` interceptor runs after the + `post_get_health` interceptor. The (possibly modified) response returned by + `post_get_health` will be passed to + `post_get_health_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyRegionBackendServiceRequest, @@ -261,12 +332,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 RegionBackendServices 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionBackendServices 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_insert( self, request: compute.InsertRegionBackendServiceRequest, @@ -285,12 +379,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionBackendServicesRequest, @@ -311,12 +428,35 @@ def post_list( ) -> compute.BackendServiceList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.BackendServiceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.BackendServiceList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_usable( self, request: compute.ListUsableRegionBackendServicesRequest, @@ -337,12 +477,37 @@ def post_list_usable( ) -> compute.BackendServiceListUsable: """Post-rpc interceptor for list_usable - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_usable_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_list_usable` interceptor runs + before the `post_list_usable_with_metadata` interceptor. """ return response + def post_list_usable_with_metadata( + self, + response: compute.BackendServiceListUsable, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.BackendServiceListUsable, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_usable + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_list_usable_with_metadata` + interceptor in new development instead of the `post_list_usable` interceptor. + When both interceptors are used, this `post_list_usable_with_metadata` interceptor runs after the + `post_list_usable` interceptor. The (possibly modified) response returned by + `post_list_usable` will be passed to + `post_list_usable_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionBackendServiceRequest, @@ -361,12 +526,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyRegionBackendServiceRequest, @@ -385,12 +573,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 RegionBackendServices 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionBackendServices 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_set_security_policy( self, request: compute.SetSecurityPolicyRegionBackendServiceRequest, @@ -411,12 +622,35 @@ def post_set_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_set_security_policy` interceptor runs + before the `post_set_security_policy_with_metadata` interceptor. """ return response + def post_set_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_set_security_policy_with_metadata` + interceptor in new development instead of the `post_set_security_policy` interceptor. + When both interceptors are used, this `post_set_security_policy_with_metadata` interceptor runs after the + `post_set_security_policy` interceptor. The (possibly modified) response returned by + `post_set_security_policy` will be passed to + `post_set_security_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsRegionBackendServiceRequest, @@ -437,12 +671,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 RegionBackendServices 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 RegionBackendServices 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( self, request: compute.UpdateRegionBackendServiceRequest, @@ -461,12 +720,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionBackendServices server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionBackendServices server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionBackendServicesRestStub: @@ -695,6 +977,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -854,6 +1140,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1003,6 +1291,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_health(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_health_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1171,6 +1463,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 @@ -1337,6 +1633,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1481,6 +1781,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1626,6 +1928,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_usable(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_usable_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1794,6 +2100,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1966,6 +2276,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 @@ -2136,6 +2450,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2289,6 +2607,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 @@ -2455,6 +2777,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/client.py index f7426af18183..d5a9503c1968 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_commitments/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/transports/rest.py index b207f0dda3e0..5359bcab9485 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_commitments/transports/rest.py @@ -134,12 +134,37 @@ def post_aggregated_list( ) -> compute.CommitmentAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionCommitments server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.CommitmentAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.CommitmentAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionCommitments server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionCommitmentRequest, @@ -157,12 +182,35 @@ def pre_get( def post_get(self, response: compute.Commitment) -> compute.Commitment: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionCommitments server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Commitment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Commitment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionCommitments server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionCommitmentRequest, @@ -180,12 +228,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionCommitments server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionCommitments server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionCommitmentsRequest, @@ -203,12 +274,35 @@ def pre_list( def post_list(self, response: compute.CommitmentList) -> compute.CommitmentList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionCommitments server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.CommitmentList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.CommitmentList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionCommitments server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateRegionCommitmentRequest, @@ -226,12 +320,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionCommitments server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionCommitments server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionCommitmentsRestStub: @@ -443,6 +560,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -598,6 +719,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -769,6 +892,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -917,6 +1044,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1088,6 +1217,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/client.py index a0b4bd78b6c2..b06410ae8c3d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/region_disk_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/transports/rest.py index 5cf89c9f26de..e8758fb495f3 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disk_types/transports/rest.py @@ -107,12 +107,35 @@ def pre_get( def post_get(self, response: compute.DiskType) -> compute.DiskType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDiskTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.DiskType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDiskTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionDiskTypesRequest, @@ -132,12 +155,35 @@ def post_list( ) -> compute.RegionDiskTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDiskTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RegionDiskTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RegionDiskTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDiskTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionDiskTypesRestStub: @@ -361,6 +407,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -505,6 +553,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/client.py index 1e4c08bc612e..502b87c1d9c7 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/region_disks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/transports/rest.py index 8b2876377397..ae5cedbac8c2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_disks/transports/rest.py @@ -230,12 +230,35 @@ def post_add_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for add_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_add_resource_policies` interceptor runs + before the `post_add_resource_policies_with_metadata` interceptor. """ return response + def post_add_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_add_resource_policies_with_metadata` + interceptor in new development instead of the `post_add_resource_policies` interceptor. + When both interceptors are used, this `post_add_resource_policies_with_metadata` interceptor runs after the + `post_add_resource_policies` interceptor. The (possibly modified) response returned by + `post_add_resource_policies` will be passed to + `post_add_resource_policies_with_metadata`. + """ + return response, metadata + def pre_bulk_insert( self, request: compute.BulkInsertRegionDiskRequest, @@ -253,12 +276,35 @@ def pre_bulk_insert( def post_bulk_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for bulk_insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_bulk_insert` interceptor runs + before the `post_bulk_insert_with_metadata` interceptor. """ return response + def post_bulk_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_bulk_insert_with_metadata` + interceptor in new development instead of the `post_bulk_insert` interceptor. + When both interceptors are used, this `post_bulk_insert_with_metadata` interceptor runs after the + `post_bulk_insert` interceptor. The (possibly modified) response returned by + `post_bulk_insert` will be passed to + `post_bulk_insert_with_metadata`. + """ + return response, metadata + def pre_create_snapshot( self, request: compute.CreateSnapshotRegionDiskRequest, @@ -276,12 +322,35 @@ def pre_create_snapshot( def post_create_snapshot(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for create_snapshot - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_snapshot_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_create_snapshot` interceptor runs + before the `post_create_snapshot_with_metadata` interceptor. """ return response + def post_create_snapshot_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_snapshot + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_create_snapshot_with_metadata` + interceptor in new development instead of the `post_create_snapshot` interceptor. + When both interceptors are used, this `post_create_snapshot_with_metadata` interceptor runs after the + `post_create_snapshot` interceptor. The (possibly modified) response returned by + `post_create_snapshot` will be passed to + `post_create_snapshot_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRegionDiskRequest, @@ -299,12 +368,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionDiskRequest, @@ -320,12 +412,33 @@ def pre_get( def post_get(self, response: compute.Disk) -> compute.Disk: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, response: compute.Disk, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Disk, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyRegionDiskRequest, @@ -343,12 +456,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 RegionDisks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionDisks 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_insert( self, request: compute.InsertRegionDiskRequest, @@ -366,12 +502,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionDisksRequest, @@ -387,12 +546,35 @@ def pre_list( def post_list(self, response: compute.DiskList) -> compute.DiskList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.DiskList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.DiskList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_remove_resource_policies( self, request: compute.RemoveResourcePoliciesRegionDiskRequest, @@ -413,12 +595,35 @@ def post_remove_resource_policies( ) -> compute.Operation: """Post-rpc interceptor for remove_resource_policies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_resource_policies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_remove_resource_policies` interceptor runs + before the `post_remove_resource_policies_with_metadata` interceptor. """ return response + def post_remove_resource_policies_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_resource_policies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_remove_resource_policies_with_metadata` + interceptor in new development instead of the `post_remove_resource_policies` interceptor. + When both interceptors are used, this `post_remove_resource_policies_with_metadata` interceptor runs after the + `post_remove_resource_policies` interceptor. The (possibly modified) response returned by + `post_remove_resource_policies` will be passed to + `post_remove_resource_policies_with_metadata`. + """ + return response, metadata + def pre_resize( self, request: compute.ResizeRegionDiskRequest, @@ -436,12 +641,35 @@ def pre_resize( def post_resize(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_resize` interceptor runs + before the `post_resize_with_metadata` interceptor. """ return response + def post_resize_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_resize_with_metadata` + interceptor in new development instead of the `post_resize` interceptor. + When both interceptors are used, this `post_resize_with_metadata` interceptor runs after the + `post_resize` interceptor. The (possibly modified) response returned by + `post_resize` will be passed to + `post_resize_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyRegionDiskRequest, @@ -459,12 +687,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 RegionDisks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionDisks 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_set_labels( self, request: compute.SetLabelsRegionDiskRequest, @@ -482,12 +733,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 RegionDisks 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionDisks 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_start_async_replication( self, request: compute.StartAsyncReplicationRegionDiskRequest, @@ -508,12 +782,35 @@ def post_start_async_replication( ) -> compute.Operation: """Post-rpc interceptor for start_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_start_async_replication` interceptor runs + before the `post_start_async_replication_with_metadata` interceptor. """ return response + def post_start_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_start_async_replication_with_metadata` + interceptor in new development instead of the `post_start_async_replication` interceptor. + When both interceptors are used, this `post_start_async_replication_with_metadata` interceptor runs after the + `post_start_async_replication` interceptor. The (possibly modified) response returned by + `post_start_async_replication` will be passed to + `post_start_async_replication_with_metadata`. + """ + return response, metadata + def pre_stop_async_replication( self, request: compute.StopAsyncReplicationRegionDiskRequest, @@ -534,12 +831,35 @@ def post_stop_async_replication( ) -> compute.Operation: """Post-rpc interceptor for stop_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_stop_async_replication` interceptor runs + before the `post_stop_async_replication_with_metadata` interceptor. """ return response + def post_stop_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_stop_async_replication_with_metadata` + interceptor in new development instead of the `post_stop_async_replication` interceptor. + When both interceptors are used, this `post_stop_async_replication_with_metadata` interceptor runs after the + `post_stop_async_replication` interceptor. The (possibly modified) response returned by + `post_stop_async_replication` will be passed to + `post_stop_async_replication_with_metadata`. + """ + return response, metadata + def pre_stop_group_async_replication( self, request: compute.StopGroupAsyncReplicationRegionDiskRequest, @@ -560,12 +880,35 @@ def post_stop_group_async_replication( ) -> compute.Operation: """Post-rpc interceptor for stop_group_async_replication - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_group_async_replication_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_stop_group_async_replication` interceptor runs + before the `post_stop_group_async_replication_with_metadata` interceptor. """ return response + def post_stop_group_async_replication_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_group_async_replication + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_stop_group_async_replication_with_metadata` + interceptor in new development instead of the `post_stop_group_async_replication` interceptor. + When both interceptors are used, this `post_stop_group_async_replication_with_metadata` interceptor runs after the + `post_stop_group_async_replication` interceptor. The (possibly modified) response returned by + `post_stop_group_async_replication` will be passed to + `post_stop_group_async_replication_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsRegionDiskRequest, @@ -586,12 +929,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 RegionDisks 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 RegionDisks 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( self, request: compute.UpdateRegionDiskRequest, @@ -609,12 +977,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionDisks server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionDisks server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionDisksRestStub: @@ -850,6 +1241,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1019,6 +1414,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1184,6 +1583,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_snapshot(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_snapshot_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1343,6 +1746,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1497,6 +1904,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1666,6 +2075,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 @@ -1831,6 +2244,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1973,6 +2390,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2140,6 +2559,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_resource_policies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_resource_policies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2305,6 +2728,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2482,6 +2909,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 @@ -2649,6 +3080,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 @@ -2816,6 +3251,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2977,6 +3416,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3148,6 +3591,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_group_async_replication(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_group_async_replication_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3298,6 +3745,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 @@ -3463,6 +3914,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/client.py index a394a0334801..368d1873a182 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_health_check_services/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/transports/rest.py index bd0ea4061c20..838a8835aa47 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_check_services/transports/rest.py @@ -132,12 +132,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthCheckServices server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthCheckServices server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionHealthCheckServiceRequest, @@ -158,12 +181,35 @@ def post_get( ) -> compute.HealthCheckService: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthCheckServices server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.HealthCheckService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.HealthCheckService, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthCheckServices server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionHealthCheckServiceRequest, @@ -182,12 +228,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthCheckServices server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthCheckServices server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionHealthCheckServicesRequest, @@ -208,12 +277,37 @@ def post_list( ) -> compute.HealthCheckServicesList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthCheckServices server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.HealthCheckServicesList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.HealthCheckServicesList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthCheckServices server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionHealthCheckServiceRequest, @@ -232,12 +326,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthCheckServices server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthCheckServices server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionHealthCheckServicesRestStub: @@ -468,6 +585,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -613,6 +734,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -779,6 +902,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -922,6 +1049,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1088,6 +1217,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/client.py index b806419b537f..392fff87cb7b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_health_checks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/transports/rest.py index c5258e0645f8..b7c6ea8740e1 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_health_checks/transports/rest.py @@ -139,12 +139,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionHealthCheckRequest, @@ -162,12 +185,35 @@ def pre_get( def post_get(self, response: compute.HealthCheck) -> compute.HealthCheck: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.HealthCheck, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.HealthCheck, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionHealthCheckRequest, @@ -185,12 +231,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionHealthChecksRequest, @@ -208,12 +277,35 @@ def pre_list( def post_list(self, response: compute.HealthCheckList) -> compute.HealthCheckList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.HealthCheckList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.HealthCheckList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionHealthCheckRequest, @@ -231,12 +323,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateRegionHealthCheckRequest, @@ -254,12 +369,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionHealthChecks server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionHealthChecks server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionHealthChecksRestStub: @@ -489,6 +627,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -652,6 +794,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -821,6 +965,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -969,6 +1117,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1140,6 +1290,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1309,6 +1463,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/client.py index 4d9d72a5ed15..137bccda27e9 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/region_instance_group_managers/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/transports/rest.py index e7fe3883fb5e..14a677ad8d92 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_group_managers/transports/rest.py @@ -276,12 +276,35 @@ def pre_abandon_instances( def post_abandon_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for abandon_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_abandon_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_abandon_instances` interceptor runs + before the `post_abandon_instances_with_metadata` interceptor. """ return response + def post_abandon_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for abandon_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_abandon_instances_with_metadata` + interceptor in new development instead of the `post_abandon_instances` interceptor. + When both interceptors are used, this `post_abandon_instances_with_metadata` interceptor runs after the + `post_abandon_instances` interceptor. The (possibly modified) response returned by + `post_abandon_instances` will be passed to + `post_abandon_instances_with_metadata`. + """ + return response, metadata + def pre_apply_updates_to_instances( self, request: compute.ApplyUpdatesToInstancesRegionInstanceGroupManagerRequest, @@ -302,12 +325,35 @@ def post_apply_updates_to_instances( ) -> compute.Operation: """Post-rpc interceptor for apply_updates_to_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_updates_to_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_apply_updates_to_instances` interceptor runs + before the `post_apply_updates_to_instances_with_metadata` interceptor. """ return response + def post_apply_updates_to_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for apply_updates_to_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_apply_updates_to_instances_with_metadata` + interceptor in new development instead of the `post_apply_updates_to_instances` interceptor. + When both interceptors are used, this `post_apply_updates_to_instances_with_metadata` interceptor runs after the + `post_apply_updates_to_instances` interceptor. The (possibly modified) response returned by + `post_apply_updates_to_instances` will be passed to + `post_apply_updates_to_instances_with_metadata`. + """ + return response, metadata + def pre_create_instances( self, request: compute.CreateInstancesRegionInstanceGroupManagerRequest, @@ -326,12 +372,35 @@ def pre_create_instances( def post_create_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for create_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_create_instances` interceptor runs + before the `post_create_instances_with_metadata` interceptor. """ return response + def post_create_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_create_instances_with_metadata` + interceptor in new development instead of the `post_create_instances` interceptor. + When both interceptors are used, this `post_create_instances_with_metadata` interceptor runs after the + `post_create_instances` interceptor. The (possibly modified) response returned by + `post_create_instances` will be passed to + `post_create_instances_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRegionInstanceGroupManagerRequest, @@ -350,12 +419,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_delete_instances( self, request: compute.DeleteInstancesRegionInstanceGroupManagerRequest, @@ -374,12 +466,35 @@ def pre_delete_instances( def post_delete_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete_instances` interceptor runs + before the `post_delete_instances_with_metadata` interceptor. """ return response + def post_delete_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_instances_with_metadata` + interceptor in new development instead of the `post_delete_instances` interceptor. + When both interceptors are used, this `post_delete_instances_with_metadata` interceptor runs after the + `post_delete_instances` interceptor. The (possibly modified) response returned by + `post_delete_instances` will be passed to + `post_delete_instances_with_metadata`. + """ + return response, metadata + def pre_delete_per_instance_configs( self, request: compute.DeletePerInstanceConfigsRegionInstanceGroupManagerRequest, @@ -400,12 +515,35 @@ def post_delete_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for delete_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_delete_per_instance_configs` interceptor runs + before the `post_delete_per_instance_configs_with_metadata` interceptor. """ return response + def post_delete_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_delete_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_delete_per_instance_configs` interceptor. + When both interceptors are used, this `post_delete_per_instance_configs_with_metadata` interceptor runs after the + `post_delete_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_delete_per_instance_configs` will be passed to + `post_delete_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionInstanceGroupManagerRequest, @@ -426,12 +564,35 @@ def post_get( ) -> compute.InstanceGroupManager: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceGroupManager, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceGroupManager, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionInstanceGroupManagerRequest, @@ -450,12 +611,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionInstanceGroupManagersRequest, @@ -476,12 +660,37 @@ def post_list( ) -> compute.RegionInstanceGroupManagerList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RegionInstanceGroupManagerList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupManagerList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_errors( self, request: compute.ListErrorsRegionInstanceGroupManagersRequest, @@ -502,12 +711,38 @@ def post_list_errors( ) -> compute.RegionInstanceGroupManagersListErrorsResponse: """Post-rpc interceptor for list_errors - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_errors_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_errors` interceptor runs + before the `post_list_errors_with_metadata` interceptor. """ return response + def post_list_errors_with_metadata( + self, + response: compute.RegionInstanceGroupManagersListErrorsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupManagersListErrorsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_errors + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_errors_with_metadata` + interceptor in new development instead of the `post_list_errors` interceptor. + When both interceptors are used, this `post_list_errors_with_metadata` interceptor runs after the + `post_list_errors` interceptor. The (possibly modified) response returned by + `post_list_errors` will be passed to + `post_list_errors_with_metadata`. + """ + return response, metadata + def pre_list_managed_instances( self, request: compute.ListManagedInstancesRegionInstanceGroupManagersRequest, @@ -528,12 +763,38 @@ def post_list_managed_instances( ) -> compute.RegionInstanceGroupManagersListInstancesResponse: """Post-rpc interceptor for list_managed_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_managed_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_managed_instances` interceptor runs + before the `post_list_managed_instances_with_metadata` interceptor. """ return response + def post_list_managed_instances_with_metadata( + self, + response: compute.RegionInstanceGroupManagersListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupManagersListInstancesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_managed_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_managed_instances_with_metadata` + interceptor in new development instead of the `post_list_managed_instances` interceptor. + When both interceptors are used, this `post_list_managed_instances_with_metadata` interceptor runs after the + `post_list_managed_instances` interceptor. The (possibly modified) response returned by + `post_list_managed_instances` will be passed to + `post_list_managed_instances_with_metadata`. + """ + return response, metadata + def pre_list_per_instance_configs( self, request: compute.ListPerInstanceConfigsRegionInstanceGroupManagersRequest, @@ -554,12 +815,38 @@ def post_list_per_instance_configs( ) -> compute.RegionInstanceGroupManagersListInstanceConfigsResp: """Post-rpc interceptor for list_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_list_per_instance_configs` interceptor runs + before the `post_list_per_instance_configs_with_metadata` interceptor. """ return response + def post_list_per_instance_configs_with_metadata( + self, + response: compute.RegionInstanceGroupManagersListInstanceConfigsResp, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupManagersListInstanceConfigsResp, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_list_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_list_per_instance_configs` interceptor. + When both interceptors are used, this `post_list_per_instance_configs_with_metadata` interceptor runs after the + `post_list_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_list_per_instance_configs` will be passed to + `post_list_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionInstanceGroupManagerRequest, @@ -578,12 +865,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_per_instance_configs( self, request: compute.PatchPerInstanceConfigsRegionInstanceGroupManagerRequest, @@ -604,12 +914,35 @@ def post_patch_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for patch_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_patch_per_instance_configs` interceptor runs + before the `post_patch_per_instance_configs_with_metadata` interceptor. """ return response + def post_patch_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_patch_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_patch_per_instance_configs` interceptor. + When both interceptors are used, this `post_patch_per_instance_configs_with_metadata` interceptor runs after the + `post_patch_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_patch_per_instance_configs` will be passed to + `post_patch_per_instance_configs_with_metadata`. + """ + return response, metadata + def pre_recreate_instances( self, request: compute.RecreateInstancesRegionInstanceGroupManagerRequest, @@ -628,12 +961,35 @@ def pre_recreate_instances( def post_recreate_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for recreate_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_recreate_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_recreate_instances` interceptor runs + before the `post_recreate_instances_with_metadata` interceptor. """ return response + def post_recreate_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for recreate_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_recreate_instances_with_metadata` + interceptor in new development instead of the `post_recreate_instances` interceptor. + When both interceptors are used, this `post_recreate_instances_with_metadata` interceptor runs after the + `post_recreate_instances` interceptor. The (possibly modified) response returned by + `post_recreate_instances` will be passed to + `post_recreate_instances_with_metadata`. + """ + return response, metadata + def pre_resize( self, request: compute.ResizeRegionInstanceGroupManagerRequest, @@ -652,12 +1008,35 @@ def pre_resize( def post_resize(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_resize` interceptor runs + before the `post_resize_with_metadata` interceptor. """ return response + def post_resize_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_resize_with_metadata` + interceptor in new development instead of the `post_resize` interceptor. + When both interceptors are used, this `post_resize_with_metadata` interceptor runs after the + `post_resize` interceptor. The (possibly modified) response returned by + `post_resize` will be passed to + `post_resize_with_metadata`. + """ + return response, metadata + def pre_resume_instances( self, request: compute.ResumeInstancesRegionInstanceGroupManagerRequest, @@ -676,12 +1055,35 @@ def pre_resume_instances( def post_resume_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resume_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_resume_instances` interceptor runs + before the `post_resume_instances_with_metadata` interceptor. """ return response + def post_resume_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_resume_instances_with_metadata` + interceptor in new development instead of the `post_resume_instances` interceptor. + When both interceptors are used, this `post_resume_instances_with_metadata` interceptor runs after the + `post_resume_instances` interceptor. The (possibly modified) response returned by + `post_resume_instances` will be passed to + `post_resume_instances_with_metadata`. + """ + return response, metadata + def pre_set_instance_template( self, request: compute.SetInstanceTemplateRegionInstanceGroupManagerRequest, @@ -702,12 +1104,35 @@ def post_set_instance_template( ) -> compute.Operation: """Post-rpc interceptor for set_instance_template - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_instance_template_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_set_instance_template` interceptor runs + before the `post_set_instance_template_with_metadata` interceptor. """ return response + def post_set_instance_template_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_instance_template + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_set_instance_template_with_metadata` + interceptor in new development instead of the `post_set_instance_template` interceptor. + When both interceptors are used, this `post_set_instance_template_with_metadata` interceptor runs after the + `post_set_instance_template` interceptor. The (possibly modified) response returned by + `post_set_instance_template` will be passed to + `post_set_instance_template_with_metadata`. + """ + return response, metadata + def pre_set_target_pools( self, request: compute.SetTargetPoolsRegionInstanceGroupManagerRequest, @@ -726,12 +1151,35 @@ def pre_set_target_pools( def post_set_target_pools(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_target_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_target_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_set_target_pools` interceptor runs + before the `post_set_target_pools_with_metadata` interceptor. """ return response + def post_set_target_pools_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_target_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_set_target_pools_with_metadata` + interceptor in new development instead of the `post_set_target_pools` interceptor. + When both interceptors are used, this `post_set_target_pools_with_metadata` interceptor runs after the + `post_set_target_pools` interceptor. The (possibly modified) response returned by + `post_set_target_pools` will be passed to + `post_set_target_pools_with_metadata`. + """ + return response, metadata + def pre_start_instances( self, request: compute.StartInstancesRegionInstanceGroupManagerRequest, @@ -750,12 +1198,35 @@ def pre_start_instances( def post_start_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for start_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_start_instances` interceptor runs + before the `post_start_instances_with_metadata` interceptor. """ return response + def post_start_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_start_instances_with_metadata` + interceptor in new development instead of the `post_start_instances` interceptor. + When both interceptors are used, this `post_start_instances_with_metadata` interceptor runs after the + `post_start_instances` interceptor. The (possibly modified) response returned by + `post_start_instances` will be passed to + `post_start_instances_with_metadata`. + """ + return response, metadata + def pre_stop_instances( self, request: compute.StopInstancesRegionInstanceGroupManagerRequest, @@ -774,12 +1245,35 @@ def pre_stop_instances( def post_stop_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for stop_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_stop_instances` interceptor runs + before the `post_stop_instances_with_metadata` interceptor. """ return response + def post_stop_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_stop_instances_with_metadata` + interceptor in new development instead of the `post_stop_instances` interceptor. + When both interceptors are used, this `post_stop_instances_with_metadata` interceptor runs after the + `post_stop_instances` interceptor. The (possibly modified) response returned by + `post_stop_instances` will be passed to + `post_stop_instances_with_metadata`. + """ + return response, metadata + def pre_suspend_instances( self, request: compute.SuspendInstancesRegionInstanceGroupManagerRequest, @@ -798,12 +1292,35 @@ def pre_suspend_instances( def post_suspend_instances(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for suspend_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_suspend_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_suspend_instances` interceptor runs + before the `post_suspend_instances_with_metadata` interceptor. """ return response + def post_suspend_instances_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for suspend_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_suspend_instances_with_metadata` + interceptor in new development instead of the `post_suspend_instances` interceptor. + When both interceptors are used, this `post_suspend_instances_with_metadata` interceptor runs after the + `post_suspend_instances` interceptor. The (possibly modified) response returned by + `post_suspend_instances` will be passed to + `post_suspend_instances_with_metadata`. + """ + return response, metadata + def pre_update_per_instance_configs( self, request: compute.UpdatePerInstanceConfigsRegionInstanceGroupManagerRequest, @@ -824,12 +1341,35 @@ def post_update_per_instance_configs( ) -> compute.Operation: """Post-rpc interceptor for update_per_instance_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_per_instance_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroupManagers server but before - it is returned to user code. + it is returned to user code. This `post_update_per_instance_configs` interceptor runs + before the `post_update_per_instance_configs_with_metadata` interceptor. """ return response + def post_update_per_instance_configs_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_per_instance_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroupManagers server but before it is returned to user code. + + We recommend only using this `post_update_per_instance_configs_with_metadata` + interceptor in new development instead of the `post_update_per_instance_configs` interceptor. + When both interceptors are used, this `post_update_per_instance_configs_with_metadata` interceptor runs after the + `post_update_per_instance_configs` interceptor. The (possibly modified) response returned by + `post_update_per_instance_configs` will be passed to + `post_update_per_instance_configs_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionInstanceGroupManagersRestStub: @@ -1068,6 +1608,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_abandon_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_abandon_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1239,6 +1783,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_updates_to_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_updates_to_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1409,6 +1957,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1569,6 +2121,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1739,6 +2295,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1910,6 +2470,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2062,6 +2626,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2228,6 +2794,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2373,6 +2943,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2520,6 +3092,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_errors(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_errors_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2669,6 +3245,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_managed_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_managed_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2820,6 +3400,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2988,6 +3572,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3159,6 +3747,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3327,6 +3919,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_recreate_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_recreate_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3487,6 +4083,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3657,6 +4257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3825,6 +4429,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_instance_template(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_instance_template_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3995,6 +4603,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_target_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_target_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4163,6 +4775,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4331,6 +4947,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4499,6 +5119,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_suspend_instances(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_suspend_instances_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4670,6 +5294,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_per_instance_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_per_instance_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py index 36fa9df7e915..d76627fb1da6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py index f062136e4df4..af7e0a3aea5b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_groups/transports/rest.py @@ -123,12 +123,35 @@ def pre_get( def post_get(self, response: compute.InstanceGroup) -> compute.InstanceGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionInstanceGroupsRequest, @@ -148,12 +171,37 @@ def post_list( ) -> compute.RegionInstanceGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RegionInstanceGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: compute.ListInstancesRegionInstanceGroupsRequest, @@ -174,12 +222,38 @@ def post_list_instances( ) -> compute.RegionInstanceGroupsListInstances: """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 RegionInstanceGroups 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: compute.RegionInstanceGroupsListInstances, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionInstanceGroupsListInstances, + 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 RegionInstanceGroups 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_set_named_ports( self, request: compute.SetNamedPortsRegionInstanceGroupRequest, @@ -198,12 +272,35 @@ def pre_set_named_ports( def post_set_named_ports(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_named_ports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_named_ports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceGroups server but before - it is returned to user code. + it is returned to user code. This `post_set_named_ports` interceptor runs + before the `post_set_named_ports_with_metadata` interceptor. """ return response + def post_set_named_ports_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_named_ports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceGroups server but before it is returned to user code. + + We recommend only using this `post_set_named_ports_with_metadata` + interceptor in new development instead of the `post_set_named_ports` interceptor. + When both interceptors are used, this `post_set_named_ports_with_metadata` interceptor runs after the + `post_set_named_ports` interceptor. The (possibly modified) response returned by + `post_set_named_ports` will be passed to + `post_set_named_ports_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionInstanceGroupsRestStub: @@ -432,6 +529,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -578,6 +677,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -727,6 +828,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 @@ -895,6 +1000,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_named_ports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_named_ports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/client.py index 1e08b1bda2d8..de228abe0e6e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_instance_templates/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/transports/rest.py index f7ddf7d8fe5a..15348ce90cbb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instance_templates/transports/rest.py @@ -124,12 +124,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionInstanceTemplateRequest, @@ -148,12 +171,35 @@ def pre_get( def post_get(self, response: compute.InstanceTemplate) -> compute.InstanceTemplate: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstanceTemplate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceTemplate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionInstanceTemplateRequest, @@ -172,12 +218,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionInstanceTemplatesRequest, @@ -198,12 +267,35 @@ def post_list( ) -> compute.InstanceTemplateList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstanceTemplates server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstanceTemplateList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstanceTemplateList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstanceTemplates server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionInstanceTemplatesRestStub: @@ -432,6 +524,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -588,6 +684,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -754,6 +852,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -897,6 +999,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/client.py index f039c6e48b98..c737552eae16 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -460,6 +462,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-compute/google/cloud/compute_v1/services/region_instances/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/transports/rest.py index 5500d15a738b..88fa7f6d328a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instances/transports/rest.py @@ -99,12 +99,35 @@ def pre_bulk_insert( def post_bulk_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for bulk_insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstances server but before - it is returned to user code. + it is returned to user code. This `post_bulk_insert` interceptor runs + before the `post_bulk_insert_with_metadata` interceptor. """ return response + def post_bulk_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstances server but before it is returned to user code. + + We recommend only using this `post_bulk_insert_with_metadata` + interceptor in new development instead of the `post_bulk_insert` interceptor. + When both interceptors are used, this `post_bulk_insert_with_metadata` interceptor runs after the + `post_bulk_insert` interceptor. The (possibly modified) response returned by + `post_bulk_insert` will be passed to + `post_bulk_insert_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionInstancesRestStub: @@ -338,6 +361,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/client.py index 0fa5694874c2..a9a0fbde5d2e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_instant_snapshots/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/transports/rest.py index ce8ab0084d53..701538b9b660 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_instant_snapshots/transports/rest.py @@ -156,12 +156,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionInstantSnapshotRequest, @@ -179,12 +202,35 @@ def pre_get( def post_get(self, response: compute.InstantSnapshot) -> compute.InstantSnapshot: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.InstantSnapshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstantSnapshot, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyRegionInstantSnapshotRequest, @@ -203,12 +249,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 RegionInstantSnapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionInstantSnapshots 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_insert( self, request: compute.InsertRegionInstantSnapshotRequest, @@ -227,12 +296,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionInstantSnapshotsRequest, @@ -253,12 +345,35 @@ def post_list( ) -> compute.InstantSnapshotList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionInstantSnapshots server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.InstantSnapshotList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.InstantSnapshotList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionInstantSnapshots server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyRegionInstantSnapshotRequest, @@ -277,12 +392,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 RegionInstantSnapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionInstantSnapshots 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_set_labels( self, request: compute.SetLabelsRegionInstantSnapshotRequest, @@ -301,12 +439,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 RegionInstantSnapshots 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionInstantSnapshots 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_test_iam_permissions( self, request: compute.TestIamPermissionsRegionInstantSnapshotRequest, @@ -327,12 +488,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 RegionInstantSnapshots 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 RegionInstantSnapshots 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 RegionInstantSnapshotsRestStub: @@ -561,6 +747,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -707,6 +897,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -873,6 +1065,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 @@ -1039,6 +1235,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1184,6 +1384,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1356,6 +1558,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 @@ -1522,6 +1728,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 @@ -1675,6 +1885,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-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/client.py index dbce8049e4a0..4512e724913e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/transports/rest.py index caf1f7fbe745..ab572891a334 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_endpoint_groups/transports/rest.py @@ -150,12 +150,35 @@ def post_attach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for attach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_attach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_attach_network_endpoints` interceptor runs + before the `post_attach_network_endpoints_with_metadata` interceptor. """ return response + def post_attach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for attach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_attach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_attach_network_endpoints` interceptor. + When both interceptors are used, this `post_attach_network_endpoints_with_metadata` interceptor runs after the + `post_attach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_attach_network_endpoints` will be passed to + `post_attach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRegionNetworkEndpointGroupRequest, @@ -174,12 +197,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_detach_network_endpoints( self, request: compute.DetachNetworkEndpointsRegionNetworkEndpointGroupRequest, @@ -200,12 +246,35 @@ def post_detach_network_endpoints( ) -> compute.Operation: """Post-rpc interceptor for detach_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_detach_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_detach_network_endpoints` interceptor runs + before the `post_detach_network_endpoints_with_metadata` interceptor. """ return response + def post_detach_network_endpoints_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for detach_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_detach_network_endpoints_with_metadata` + interceptor in new development instead of the `post_detach_network_endpoints` interceptor. + When both interceptors are used, this `post_detach_network_endpoints_with_metadata` interceptor runs after the + `post_detach_network_endpoints` interceptor. The (possibly modified) response returned by + `post_detach_network_endpoints` will be passed to + `post_detach_network_endpoints_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionNetworkEndpointGroupRequest, @@ -226,12 +295,35 @@ def post_get( ) -> compute.NetworkEndpointGroup: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NetworkEndpointGroup, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NetworkEndpointGroup, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionNetworkEndpointGroupRequest, @@ -250,12 +342,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionNetworkEndpointGroupsRequest, @@ -276,12 +391,37 @@ def post_list( ) -> compute.NetworkEndpointGroupList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NetworkEndpointGroupList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_network_endpoints( self, request: compute.ListNetworkEndpointsRegionNetworkEndpointGroupsRequest, @@ -302,12 +442,38 @@ def post_list_network_endpoints( ) -> compute.NetworkEndpointGroupsListNetworkEndpoints: """Post-rpc interceptor for list_network_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_network_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkEndpointGroups server but before - it is returned to user code. + it is returned to user code. This `post_list_network_endpoints` interceptor runs + before the `post_list_network_endpoints_with_metadata` interceptor. """ return response + def post_list_network_endpoints_with_metadata( + self, + response: compute.NetworkEndpointGroupsListNetworkEndpoints, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NetworkEndpointGroupsListNetworkEndpoints, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_network_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkEndpointGroups server but before it is returned to user code. + + We recommend only using this `post_list_network_endpoints_with_metadata` + interceptor in new development instead of the `post_list_network_endpoints` interceptor. + When both interceptors are used, this `post_list_network_endpoints_with_metadata` interceptor runs after the + `post_list_network_endpoints` interceptor. The (possibly modified) response returned by + `post_list_network_endpoints` will be passed to + `post_list_network_endpoints_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionNetworkEndpointGroupsRestStub: @@ -548,6 +714,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_attach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_attach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -708,6 +878,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -878,6 +1052,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_detach_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_detach_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1029,6 +1207,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1195,6 +1375,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1338,6 +1522,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1485,6 +1671,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_network_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_network_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/client.py index 0fe4acd9ec43..e3c1bc3483f6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/region_network_firewall_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/transports/rest.py index fd6aa01c219f..b7ee14bf433b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_network_firewall_policies/transports/rest.py @@ -228,12 +228,35 @@ def pre_add_association( def post_add_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_association` interceptor runs + before the `post_add_association_with_metadata` interceptor. """ return response + def post_add_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_association_with_metadata` + interceptor in new development instead of the `post_add_association` interceptor. + When both interceptors are used, this `post_add_association_with_metadata` interceptor runs after the + `post_add_association` interceptor. The (possibly modified) response returned by + `post_add_association` will be passed to + `post_add_association_with_metadata`. + """ + return response, metadata + def pre_add_rule( self, request: compute.AddRuleRegionNetworkFirewallPolicyRequest, @@ -252,12 +275,35 @@ def pre_add_rule( def post_add_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_rule` interceptor runs + before the `post_add_rule_with_metadata` interceptor. """ return response + def post_add_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_add_rule_with_metadata` + interceptor in new development instead of the `post_add_rule` interceptor. + When both interceptors are used, this `post_add_rule_with_metadata` interceptor runs after the + `post_add_rule` interceptor. The (possibly modified) response returned by + `post_add_rule` will be passed to + `post_add_rule_with_metadata`. + """ + return response, metadata + def pre_clone_rules( self, request: compute.CloneRulesRegionNetworkFirewallPolicyRequest, @@ -276,12 +322,35 @@ def pre_clone_rules( def post_clone_rules(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for clone_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_clone_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_clone_rules` interceptor runs + before the `post_clone_rules_with_metadata` interceptor. """ return response + def post_clone_rules_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for clone_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_clone_rules_with_metadata` + interceptor in new development instead of the `post_clone_rules` interceptor. + When both interceptors are used, this `post_clone_rules_with_metadata` interceptor runs after the + `post_clone_rules` interceptor. The (possibly modified) response returned by + `post_clone_rules` will be passed to + `post_clone_rules_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRegionNetworkFirewallPolicyRequest, @@ -300,12 +369,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionNetworkFirewallPolicyRequest, @@ -324,12 +416,35 @@ def pre_get( def post_get(self, response: compute.FirewallPolicy) -> compute.FirewallPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.FirewallPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_association( self, request: compute.GetAssociationRegionNetworkFirewallPolicyRequest, @@ -350,12 +465,37 @@ def post_get_association( ) -> compute.FirewallPolicyAssociation: """Post-rpc interceptor for get_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_association` interceptor runs + before the `post_get_association_with_metadata` interceptor. """ return response + def post_get_association_with_metadata( + self, + response: compute.FirewallPolicyAssociation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.FirewallPolicyAssociation, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_association_with_metadata` + interceptor in new development instead of the `post_get_association` interceptor. + When both interceptors are used, this `post_get_association_with_metadata` interceptor runs after the + `post_get_association` interceptor. The (possibly modified) response returned by + `post_get_association` will be passed to + `post_get_association_with_metadata`. + """ + return response, metadata + def pre_get_effective_firewalls( self, request: compute.GetEffectiveFirewallsRegionNetworkFirewallPolicyRequest, @@ -377,12 +517,38 @@ def post_get_effective_firewalls( ) -> compute.RegionNetworkFirewallPoliciesGetEffectiveFirewallsResponse: """Post-rpc interceptor for get_effective_firewalls - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_firewalls_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_firewalls` interceptor runs + before the `post_get_effective_firewalls_with_metadata` interceptor. """ return response + def post_get_effective_firewalls_with_metadata( + self, + response: compute.RegionNetworkFirewallPoliciesGetEffectiveFirewallsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.RegionNetworkFirewallPoliciesGetEffectiveFirewallsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_firewalls + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_effective_firewalls_with_metadata` + interceptor in new development instead of the `post_get_effective_firewalls` interceptor. + When both interceptors are used, this `post_get_effective_firewalls_with_metadata` interceptor runs after the + `post_get_effective_firewalls` interceptor. The (possibly modified) response returned by + `post_get_effective_firewalls` will be passed to + `post_get_effective_firewalls_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyRegionNetworkFirewallPolicyRequest, @@ -401,12 +567,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 RegionNetworkFirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionNetworkFirewallPolicies 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_rule( self, request: compute.GetRuleRegionNetworkFirewallPolicyRequest, @@ -427,12 +616,35 @@ def post_get_rule( ) -> compute.FirewallPolicyRule: """Post-rpc interceptor for get_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_rule` interceptor runs + before the `post_get_rule_with_metadata` interceptor. """ return response + def post_get_rule_with_metadata( + self, + response: compute.FirewallPolicyRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_get_rule_with_metadata` + interceptor in new development instead of the `post_get_rule` interceptor. + When both interceptors are used, this `post_get_rule_with_metadata` interceptor runs after the + `post_get_rule` interceptor. The (possibly modified) response returned by + `post_get_rule` will be passed to + `post_get_rule_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionNetworkFirewallPolicyRequest, @@ -451,12 +663,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionNetworkFirewallPoliciesRequest, @@ -477,12 +712,35 @@ def post_list( ) -> compute.FirewallPolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.FirewallPolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.FirewallPolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionNetworkFirewallPolicyRequest, @@ -501,12 +759,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_rule( self, request: compute.PatchRuleRegionNetworkFirewallPolicyRequest, @@ -525,12 +806,35 @@ def pre_patch_rule( def post_patch_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch_rule` interceptor runs + before the `post_patch_rule_with_metadata` interceptor. """ return response + def post_patch_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_rule_with_metadata` + interceptor in new development instead of the `post_patch_rule` interceptor. + When both interceptors are used, this `post_patch_rule_with_metadata` interceptor runs after the + `post_patch_rule` interceptor. The (possibly modified) response returned by + `post_patch_rule` will be passed to + `post_patch_rule_with_metadata`. + """ + return response, metadata + def pre_remove_association( self, request: compute.RemoveAssociationRegionNetworkFirewallPolicyRequest, @@ -549,12 +853,35 @@ def pre_remove_association( def post_remove_association(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_association - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_association_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_association` interceptor runs + before the `post_remove_association_with_metadata` interceptor. """ return response + def post_remove_association_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_association + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_association_with_metadata` + interceptor in new development instead of the `post_remove_association` interceptor. + When both interceptors are used, this `post_remove_association_with_metadata` interceptor runs after the + `post_remove_association` interceptor. The (possibly modified) response returned by + `post_remove_association` will be passed to + `post_remove_association_with_metadata`. + """ + return response, metadata + def pre_remove_rule( self, request: compute.RemoveRuleRegionNetworkFirewallPolicyRequest, @@ -573,12 +900,35 @@ def pre_remove_rule( def post_remove_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNetworkFirewallPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_rule` interceptor runs + before the `post_remove_rule_with_metadata` interceptor. """ return response + def post_remove_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNetworkFirewallPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_rule_with_metadata` + interceptor in new development instead of the `post_remove_rule` interceptor. + When both interceptors are used, this `post_remove_rule_with_metadata` interceptor runs after the + `post_remove_rule` interceptor. The (possibly modified) response returned by + `post_remove_rule` will be passed to + `post_remove_rule_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyRegionNetworkFirewallPolicyRequest, @@ -597,12 +947,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 RegionNetworkFirewallPolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionNetworkFirewallPolicies 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: compute.TestIamPermissionsRegionNetworkFirewallPolicyRequest, @@ -623,12 +996,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 RegionNetworkFirewallPolicies 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 RegionNetworkFirewallPolicies 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 RegionNetworkFirewallPoliciesRestStub: @@ -867,6 +1265,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1035,6 +1437,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1197,6 +1603,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_clone_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_clone_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1357,6 +1767,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1502,6 +1916,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1645,6 +2061,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1798,6 +2218,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_effective_firewalls(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_effective_firewalls_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1968,6 +2392,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 @@ -2117,6 +2545,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2283,6 +2715,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2426,6 +2862,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2592,6 +3030,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2760,6 +3202,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2922,6 +3368,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_association(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_association_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3084,6 +3534,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3258,6 +3712,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 @@ -3409,6 +3867,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-compute/google/cloud/compute_v1/services/region_notification_endpoints/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/client.py index ec840c2311b0..22ed4a0a3528 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -465,6 +467,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-compute/google/cloud/compute_v1/services/region_notification_endpoints/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/transports/rest.py index edbf0ba208d4..264486a4979a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_notification_endpoints/transports/rest.py @@ -124,12 +124,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNotificationEndpoints server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNotificationEndpoints server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionNotificationEndpointRequest, @@ -150,12 +173,35 @@ def post_get( ) -> compute.NotificationEndpoint: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNotificationEndpoints server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.NotificationEndpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NotificationEndpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNotificationEndpoints server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionNotificationEndpointRequest, @@ -174,12 +220,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNotificationEndpoints server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNotificationEndpoints server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionNotificationEndpointsRequest, @@ -200,12 +269,37 @@ def post_list( ) -> compute.NotificationEndpointList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionNotificationEndpoints server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.NotificationEndpointList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.NotificationEndpointList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionNotificationEndpoints server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionNotificationEndpointsRestStub: @@ -436,6 +530,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -586,6 +684,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -752,6 +852,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -895,6 +999,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/client.py index 4acc182d914d..bf7f5b56a90a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/region_operations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/transports/rest.py index 48d16f6f571a..0009d9b06ce8 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_operations/transports/rest.py @@ -125,12 +125,37 @@ def post_delete( ) -> compute.DeleteRegionOperationResponse: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionOperations server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.DeleteRegionOperationResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.DeleteRegionOperationResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionOperations server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionOperationRequest, @@ -148,12 +173,35 @@ def pre_get( def post_get(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionOperations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionOperations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionOperationsRequest, @@ -171,12 +219,35 @@ def pre_list( def post_list(self, response: compute.OperationList) -> compute.OperationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionOperations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.OperationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.OperationList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionOperations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_wait( self, request: compute.WaitRegionOperationRequest, @@ -194,12 +265,35 @@ def pre_wait( def post_wait(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for wait - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_wait_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionOperations server but before - it is returned to user code. + it is returned to user code. This `post_wait` interceptor runs + before the `post_wait_with_metadata` interceptor. """ return response + def post_wait_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for wait + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionOperations server but before it is returned to user code. + + We recommend only using this `post_wait_with_metadata` + interceptor in new development instead of the `post_wait` interceptor. + When both interceptors are used, this `post_wait_with_metadata` interceptor runs after the + `post_wait` interceptor. The (possibly modified) response returned by + `post_wait` will be passed to + `post_wait_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionOperationsRestStub: @@ -417,6 +511,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -580,6 +678,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -726,6 +826,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -887,6 +989,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_wait(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_wait_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/client.py index 5397a4f2c083..aa60a2548827 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_security_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/transports/rest.py index 944ecf5f46ac..78d4924dec25 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_security_policies/transports/rest.py @@ -172,12 +172,35 @@ def pre_add_rule( def post_add_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_rule` interceptor runs + before the `post_add_rule_with_metadata` interceptor. """ return response + def post_add_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_add_rule_with_metadata` + interceptor in new development instead of the `post_add_rule` interceptor. + When both interceptors are used, this `post_add_rule_with_metadata` interceptor runs after the + `post_add_rule` interceptor. The (possibly modified) response returned by + `post_add_rule` will be passed to + `post_add_rule_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRegionSecurityPolicyRequest, @@ -196,12 +219,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionSecurityPolicyRequest, @@ -219,12 +265,35 @@ def pre_get( def post_get(self, response: compute.SecurityPolicy) -> compute.SecurityPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SecurityPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_rule( self, request: compute.GetRuleRegionSecurityPolicyRequest, @@ -245,12 +314,35 @@ def post_get_rule( ) -> compute.SecurityPolicyRule: """Post-rpc interceptor for get_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_rule` interceptor runs + before the `post_get_rule_with_metadata` interceptor. """ return response + def post_get_rule_with_metadata( + self, + response: compute.SecurityPolicyRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicyRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_get_rule_with_metadata` + interceptor in new development instead of the `post_get_rule` interceptor. + When both interceptors are used, this `post_get_rule_with_metadata` interceptor runs after the + `post_get_rule` interceptor. The (possibly modified) response returned by + `post_get_rule` will be passed to + `post_get_rule_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionSecurityPolicyRequest, @@ -269,12 +361,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionSecurityPoliciesRequest, @@ -295,12 +410,35 @@ def post_list( ) -> compute.SecurityPolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SecurityPolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionSecurityPolicyRequest, @@ -319,12 +457,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_rule( self, request: compute.PatchRuleRegionSecurityPolicyRequest, @@ -343,12 +504,35 @@ def pre_patch_rule( def post_patch_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch_rule` interceptor runs + before the `post_patch_rule_with_metadata` interceptor. """ return response + def post_patch_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_rule_with_metadata` + interceptor in new development instead of the `post_patch_rule` interceptor. + When both interceptors are used, this `post_patch_rule_with_metadata` interceptor runs after the + `post_patch_rule` interceptor. The (possibly modified) response returned by + `post_patch_rule` will be passed to + `post_patch_rule_with_metadata`. + """ + return response, metadata + def pre_remove_rule( self, request: compute.RemoveRuleRegionSecurityPolicyRequest, @@ -367,12 +551,35 @@ def pre_remove_rule( def post_remove_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_rule` interceptor runs + before the `post_remove_rule_with_metadata` interceptor. """ return response + def post_remove_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_rule_with_metadata` + interceptor in new development instead of the `post_remove_rule` interceptor. + When both interceptors are used, this `post_remove_rule_with_metadata` interceptor runs after the + `post_remove_rule` interceptor. The (possibly modified) response returned by + `post_remove_rule` will be passed to + `post_remove_rule_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsRegionSecurityPolicyRequest, @@ -391,12 +598,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 RegionSecurityPolicies 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 RegionSecurityPolicies 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 + @dataclasses.dataclass class RegionSecurityPoliciesRestStub: @@ -631,6 +861,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -791,6 +1025,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -940,6 +1178,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1087,6 +1327,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1253,6 +1497,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1396,6 +1644,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1562,6 +1812,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1728,6 +1982,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1888,6 +2146,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2054,6 +2316,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/client.py index 95b6fa9697ed..125f67334ff6 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_ssl_certificates/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/transports/rest.py index 0a623f2a845c..47da6f36956a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_certificates/transports/rest.py @@ -124,12 +124,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslCertificates server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionSslCertificateRequest, @@ -147,12 +170,35 @@ def pre_get( def post_get(self, response: compute.SslCertificate) -> compute.SslCertificate: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SslCertificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslCertificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslCertificates server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionSslCertificateRequest, @@ -171,12 +217,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslCertificates server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionSslCertificatesRequest, @@ -197,12 +266,35 @@ def post_list( ) -> compute.SslCertificateList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SslCertificateList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslCertificateList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslCertificates server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionSslCertificatesRestStub: @@ -431,6 +523,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -595,6 +691,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -761,6 +859,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -905,6 +1007,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/client.py index aa70dd7b6b0c..fb14fddb31de 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_ssl_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/transports/rest.py index 7e0f71dd5fd4..23c658e3a650 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_ssl_policies/transports/rest.py @@ -139,12 +139,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionSslPolicyRequest, @@ -162,12 +185,35 @@ def pre_get( def post_get(self, response: compute.SslPolicy) -> compute.SslPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SslPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionSslPolicyRequest, @@ -185,12 +231,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionSslPoliciesRequest, @@ -208,12 +277,35 @@ def pre_list( def post_list(self, response: compute.SslPoliciesList) -> compute.SslPoliciesList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SslPoliciesList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslPoliciesList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_available_features( self, request: compute.ListAvailableFeaturesRegionSslPoliciesRequest, @@ -234,12 +326,38 @@ def post_list_available_features( ) -> compute.SslPoliciesListAvailableFeaturesResponse: """Post-rpc interceptor for list_available_features - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_available_features_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list_available_features` interceptor runs + before the `post_list_available_features_with_metadata` interceptor. """ return response + def post_list_available_features_with_metadata( + self, + response: compute.SslPoliciesListAvailableFeaturesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SslPoliciesListAvailableFeaturesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_available_features + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_list_available_features_with_metadata` + interceptor in new development instead of the `post_list_available_features` interceptor. + When both interceptors are used, this `post_list_available_features_with_metadata` interceptor runs after the + `post_list_available_features` interceptor. The (possibly modified) response returned by + `post_list_available_features` will be passed to + `post_list_available_features_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionSslPolicyRequest, @@ -257,12 +375,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionSslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionSslPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionSslPoliciesRestStub: @@ -494,6 +635,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -645,6 +790,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -816,6 +963,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -962,6 +1113,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1109,6 +1262,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_available_features(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_available_features_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1284,6 +1441,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/client.py index fa54a59e5bb3..7f286724acac 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_target_http_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/transports/rest.py index c68fd20b9ff7..5e85179e2b60 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_http_proxies/transports/rest.py @@ -132,12 +132,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionTargetHttpProxyRequest, @@ -155,12 +178,35 @@ def pre_get( def post_get(self, response: compute.TargetHttpProxy) -> compute.TargetHttpProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetHttpProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionTargetHttpProxyRequest, @@ -179,12 +225,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionTargetHttpProxiesRequest, @@ -205,12 +274,35 @@ def post_list( ) -> compute.TargetHttpProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetHttpProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_url_map( self, request: compute.SetUrlMapRegionTargetHttpProxyRequest, @@ -229,12 +321,35 @@ def pre_set_url_map( def post_set_url_map(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_url_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_url_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_url_map` interceptor runs + before the `post_set_url_map_with_metadata` interceptor. """ return response + def post_set_url_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_url_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_set_url_map_with_metadata` + interceptor in new development instead of the `post_set_url_map` interceptor. + When both interceptors are used, this `post_set_url_map_with_metadata` interceptor runs after the + `post_set_url_map` interceptor. The (possibly modified) response returned by + `post_set_url_map` will be passed to + `post_set_url_map_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionTargetHttpProxiesRestStub: @@ -463,6 +578,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -622,6 +741,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -788,6 +909,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -931,6 +1056,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1097,6 +1224,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_url_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_url_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/client.py index 73a0907ef29b..ea552f075818 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_target_https_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/transports/rest.py index 8c0ca8797d45..e1aa79ffe801 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_https_proxies/transports/rest.py @@ -148,12 +148,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionTargetHttpsProxyRequest, @@ -172,12 +195,35 @@ def pre_get( def post_get(self, response: compute.TargetHttpsProxy) -> compute.TargetHttpsProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetHttpsProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpsProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionTargetHttpsProxyRequest, @@ -196,12 +242,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionTargetHttpsProxiesRequest, @@ -222,12 +291,35 @@ def post_list( ) -> compute.TargetHttpsProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetHttpsProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpsProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionTargetHttpsProxyRequest, @@ -246,12 +338,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_ssl_certificates( self, request: compute.SetSslCertificatesRegionTargetHttpsProxyRequest, @@ -272,12 +387,35 @@ def post_set_ssl_certificates( ) -> compute.Operation: """Post-rpc interceptor for set_ssl_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_ssl_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_ssl_certificates` interceptor runs + before the `post_set_ssl_certificates_with_metadata` interceptor. """ return response + def post_set_ssl_certificates_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_ssl_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_ssl_certificates_with_metadata` + interceptor in new development instead of the `post_set_ssl_certificates` interceptor. + When both interceptors are used, this `post_set_ssl_certificates_with_metadata` interceptor runs after the + `post_set_ssl_certificates` interceptor. The (possibly modified) response returned by + `post_set_ssl_certificates` will be passed to + `post_set_ssl_certificates_with_metadata`. + """ + return response, metadata + def pre_set_url_map( self, request: compute.SetUrlMapRegionTargetHttpsProxyRequest, @@ -296,12 +434,35 @@ def pre_set_url_map( def post_set_url_map(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_url_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_url_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_url_map` interceptor runs + before the `post_set_url_map_with_metadata` interceptor. """ return response + def post_set_url_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_url_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_url_map_with_metadata` + interceptor in new development instead of the `post_set_url_map` interceptor. + When both interceptors are used, this `post_set_url_map_with_metadata` interceptor runs after the + `post_set_url_map` interceptor. The (possibly modified) response returned by + `post_set_url_map` will be passed to + `post_set_url_map_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionTargetHttpsProxiesRestStub: @@ -530,6 +691,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -689,6 +854,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -855,6 +1022,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1000,6 +1171,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1166,6 +1339,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1336,6 +1513,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_ssl_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_ssl_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1502,6 +1683,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_url_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_url_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/client.py index 50ecedd90e0f..d37492e41567 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/transports/rest.py index 37db37a45b23..c48907632d2c 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_target_tcp_proxies/transports/rest.py @@ -124,12 +124,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionTargetTcpProxyRequest, @@ -147,12 +170,35 @@ def pre_get( def post_get(self, response: compute.TargetTcpProxy) -> compute.TargetTcpProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetTcpProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetTcpProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionTargetTcpProxyRequest, @@ -171,12 +217,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionTargetTcpProxiesRequest, @@ -197,12 +266,35 @@ def post_list( ) -> compute.TargetTcpProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionTargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetTcpProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetTcpProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionTargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionTargetTcpProxiesRestStub: @@ -431,6 +523,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -582,6 +678,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -748,6 +846,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -893,6 +995,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/client.py index 4fd963616d99..75621483447f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/region_url_maps/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/transports/rest.py index e6e09e728059..d42df37e2e76 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_url_maps/transports/rest.py @@ -147,12 +147,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRegionUrlMapRequest, @@ -168,12 +191,35 @@ def pre_get( def post_get(self, response: compute.UrlMap) -> compute.UrlMap: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.UrlMap, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.UrlMap, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRegionUrlMapRequest, @@ -191,12 +237,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionUrlMapsRequest, @@ -214,12 +283,35 @@ def pre_list( def post_list(self, response: compute.UrlMapList) -> compute.UrlMapList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.UrlMapList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.UrlMapList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRegionUrlMapRequest, @@ -237,12 +329,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateRegionUrlMapRequest, @@ -260,12 +375,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + def pre_validate( self, request: compute.ValidateRegionUrlMapRequest, @@ -285,12 +423,37 @@ def post_validate( ) -> compute.UrlMapsValidateResponse: """Post-rpc interceptor for validate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionUrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_validate` interceptor runs + before the `post_validate_with_metadata` interceptor. """ return response + def post_validate_with_metadata( + self, + response: compute.UrlMapsValidateResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.UrlMapsValidateResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for validate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionUrlMaps server but before it is returned to user code. + + We recommend only using this `post_validate_with_metadata` + interceptor in new development instead of the `post_validate` interceptor. + When both interceptors are used, this `post_validate_with_metadata` interceptor runs after the + `post_validate` interceptor. The (possibly modified) response returned by + `post_validate` will be passed to + `post_validate_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionUrlMapsRestStub: @@ -520,6 +683,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -687,6 +854,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -854,6 +1023,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -996,6 +1169,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1163,6 +1338,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1330,6 +1509,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1482,6 +1665,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_validate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_validate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/client.py index 530559c6120b..e78218e0923f 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/region_zones/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/transports/rest.py index 256ede8e847e..aed6e8d15287 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/region_zones/transports/rest.py @@ -97,12 +97,35 @@ def pre_list( def post_list(self, response: compute.ZoneList) -> compute.ZoneList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegionZones server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ZoneList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ZoneList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegionZones server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionZonesRestStub: @@ -313,6 +336,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/client.py index decc780fcfc5..abe714cae143 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/regions/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/transports/rest.py index f3c963e4cd20..267dd4fa6034 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/regions/transports/rest.py @@ -105,12 +105,35 @@ def pre_get( def post_get(self, response: compute.Region) -> compute.Region: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Regions server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Region, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Region, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Regions server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRegionsRequest, @@ -126,12 +149,35 @@ def pre_list( def post_list(self, response: compute.RegionList) -> compute.RegionList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Regions server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RegionList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RegionList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Regions server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RegionsRestStub: @@ -343,6 +389,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -482,6 +530,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/client.py index 7f9b16706854..252f66e28ac4 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/reservations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/transports/rest.py index 3451435a917e..35e239cc1f24 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/reservations/transports/rest.py @@ -174,12 +174,37 @@ def post_aggregated_list( ) -> compute.ReservationAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.ReservationAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ReservationAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteReservationRequest, @@ -197,12 +222,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetReservationRequest, @@ -218,12 +266,35 @@ def pre_get( def post_get(self, response: compute.Reservation) -> compute.Reservation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Reservation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Reservation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyReservationRequest, @@ -241,12 +312,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Reservations 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Reservations 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_insert( self, request: compute.InsertReservationRequest, @@ -264,12 +358,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListReservationsRequest, @@ -287,12 +404,35 @@ def pre_list( def post_list(self, response: compute.ReservationList) -> compute.ReservationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ReservationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ReservationList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_resize( self, request: compute.ResizeReservationRequest, @@ -310,12 +450,35 @@ def pre_resize( def post_resize(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for resize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_resize` interceptor runs + before the `post_resize_with_metadata` interceptor. """ return response + def post_resize_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_resize_with_metadata` + interceptor in new development instead of the `post_resize` interceptor. + When both interceptors are used, this `post_resize_with_metadata` interceptor runs after the + `post_resize` interceptor. The (possibly modified) response returned by + `post_resize` will be passed to + `post_resize_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyReservationRequest, @@ -333,12 +496,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Reservations 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Reservations 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: compute.TestIamPermissionsReservationRequest, @@ -359,12 +545,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Reservations 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Reservations 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( self, request: compute.UpdateReservationRequest, @@ -382,12 +593,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Reservations server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Reservations server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ReservationsRestStub: @@ -598,6 +832,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -761,6 +999,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -909,6 +1151,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1076,6 +1320,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 @@ -1243,6 +1491,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1385,6 +1637,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1552,6 +1806,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1727,6 +1985,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 @@ -1877,6 +2139,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 @@ -2044,6 +2310,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/client.py index ac504cf7992c..c627e465e161 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/resource_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/transports/rest.py index c6844bf8cd3a..35da593982e0 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/resource_policies/transports/rest.py @@ -166,12 +166,37 @@ def post_aggregated_list( ) -> compute.ResourcePolicyAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.ResourcePolicyAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ResourcePolicyAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteResourcePolicyRequest, @@ -189,12 +214,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetResourcePolicyRequest, @@ -212,12 +260,35 @@ def pre_get( def post_get(self, response: compute.ResourcePolicy) -> compute.ResourcePolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ResourcePolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ResourcePolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyResourcePolicyRequest, @@ -236,12 +307,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 ResourcePolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ResourcePolicies 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_insert( self, request: compute.InsertResourcePolicyRequest, @@ -259,12 +353,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListResourcePoliciesRequest, @@ -284,12 +401,35 @@ def post_list( ) -> compute.ResourcePolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ResourcePolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ResourcePolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchResourcePolicyRequest, @@ -307,12 +447,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ResourcePolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ResourcePolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyResourcePolicyRequest, @@ -331,12 +494,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 ResourcePolicies 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ResourcePolicies 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: compute.TestIamPermissionsResourcePolicyRequest, @@ -357,12 +543,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 ResourcePolicies 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 ResourcePolicies 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 ResourcePoliciesRestStub: @@ -573,6 +784,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -738,6 +953,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -888,6 +1107,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1053,6 +1274,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 @@ -1224,6 +1449,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1368,6 +1597,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1537,6 +1768,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1708,6 +1943,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 @@ -1859,6 +2098,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-compute/google/cloud/compute_v1/services/routers/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/client.py index 7c0d840508e2..31b2c8e2d0a9 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/routers/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/transports/rest.py index b93cd18f9006..7545ad578e44 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/routers/transports/rest.py @@ -181,12 +181,35 @@ def post_aggregated_list( ) -> compute.RouterAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.RouterAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RouterAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteRouterRequest, @@ -202,12 +225,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRouterRequest, @@ -223,12 +269,35 @@ def pre_get( def post_get(self, response: compute.Router) -> compute.Router: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Router, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Router, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_nat_ip_info( self, request: compute.GetNatIpInfoRouterRequest, @@ -248,12 +317,35 @@ def post_get_nat_ip_info( ) -> compute.NatIpInfoResponse: """Post-rpc interceptor for get_nat_ip_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_nat_ip_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_get_nat_ip_info` interceptor runs + before the `post_get_nat_ip_info_with_metadata` interceptor. """ return response + def post_get_nat_ip_info_with_metadata( + self, + response: compute.NatIpInfoResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.NatIpInfoResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_nat_ip_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_get_nat_ip_info_with_metadata` + interceptor in new development instead of the `post_get_nat_ip_info` interceptor. + When both interceptors are used, this `post_get_nat_ip_info_with_metadata` interceptor runs after the + `post_get_nat_ip_info` interceptor. The (possibly modified) response returned by + `post_get_nat_ip_info` will be passed to + `post_get_nat_ip_info_with_metadata`. + """ + return response, metadata + def pre_get_nat_mapping_info( self, request: compute.GetNatMappingInfoRoutersRequest, @@ -273,12 +365,37 @@ def post_get_nat_mapping_info( ) -> compute.VmEndpointNatMappingsList: """Post-rpc interceptor for get_nat_mapping_info - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_nat_mapping_info_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_get_nat_mapping_info` interceptor runs + before the `post_get_nat_mapping_info_with_metadata` interceptor. """ return response + def post_get_nat_mapping_info_with_metadata( + self, + response: compute.VmEndpointNatMappingsList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.VmEndpointNatMappingsList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_nat_mapping_info + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_get_nat_mapping_info_with_metadata` + interceptor in new development instead of the `post_get_nat_mapping_info` interceptor. + When both interceptors are used, this `post_get_nat_mapping_info_with_metadata` interceptor runs after the + `post_get_nat_mapping_info` interceptor. The (possibly modified) response returned by + `post_get_nat_mapping_info` will be passed to + `post_get_nat_mapping_info_with_metadata`. + """ + return response, metadata + def pre_get_router_status( self, request: compute.GetRouterStatusRouterRequest, @@ -298,12 +415,35 @@ def post_get_router_status( ) -> compute.RouterStatusResponse: """Post-rpc interceptor for get_router_status - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_router_status_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_get_router_status` interceptor runs + before the `post_get_router_status_with_metadata` interceptor. """ return response + def post_get_router_status_with_metadata( + self, + response: compute.RouterStatusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RouterStatusResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_router_status + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_get_router_status_with_metadata` + interceptor in new development instead of the `post_get_router_status` interceptor. + When both interceptors are used, this `post_get_router_status_with_metadata` interceptor runs after the + `post_get_router_status` interceptor. The (possibly modified) response returned by + `post_get_router_status` will be passed to + `post_get_router_status_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRouterRequest, @@ -319,12 +459,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRoutersRequest, @@ -340,12 +503,35 @@ def pre_list( def post_list(self, response: compute.RouterList) -> compute.RouterList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RouterList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RouterList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchRouterRequest, @@ -361,12 +547,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_preview( self, request: compute.PreviewRouterRequest, @@ -384,12 +593,35 @@ def post_preview( ) -> compute.RoutersPreviewResponse: """Post-rpc interceptor for preview - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_preview_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_preview` interceptor runs + before the `post_preview_with_metadata` interceptor. """ return response + def post_preview_with_metadata( + self, + response: compute.RoutersPreviewResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RoutersPreviewResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for preview + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_preview_with_metadata` + interceptor in new development instead of the `post_preview` interceptor. + When both interceptors are used, this `post_preview_with_metadata` interceptor runs after the + `post_preview` interceptor. The (possibly modified) response returned by + `post_preview` will be passed to + `post_preview_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateRouterRequest, @@ -405,12 +637,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routers server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routers server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RoutersRestStub: @@ -625,6 +880,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -781,6 +1040,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -923,6 +1186,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1067,6 +1332,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_nat_ip_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_nat_ip_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1215,6 +1484,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_nat_mapping_info(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_nat_mapping_info_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1365,6 +1638,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_router_status(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_router_status_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1527,6 +1804,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1666,6 +1947,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1828,6 +2111,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1976,6 +2263,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_preview(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_preview_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2138,6 +2429,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/client.py index 90fd226d634e..5d4cdc17da12 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/routes/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/transports/rest.py index a973f61e35ce..3c33ca12ef16 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/routes/transports/rest.py @@ -121,12 +121,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routes server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routes server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetRouteRequest, @@ -142,12 +165,33 @@ def pre_get( def post_get(self, response: compute.Route) -> compute.Route: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, response: compute.Route, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Route, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertRouteRequest, @@ -163,12 +207,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routes server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routes server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListRoutesRequest, @@ -184,12 +251,35 @@ def pre_list( def post_list(self, response: compute.RouteList) -> compute.RouteList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Routes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.RouteList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.RouteList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Routes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class RoutesRestStub: @@ -414,6 +504,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -559,6 +653,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -721,6 +817,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -860,6 +960,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/client.py index 1ff21e572484..35edca7fdae9 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/security_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/transports/rest.py index bce161ff8039..e4e230a500a5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/security_policies/transports/rest.py @@ -187,12 +187,35 @@ def pre_add_rule( def post_add_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_add_rule` interceptor runs + before the `post_add_rule_with_metadata` interceptor. """ return response + def post_add_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_add_rule_with_metadata` + interceptor in new development instead of the `post_add_rule` interceptor. + When both interceptors are used, this `post_add_rule_with_metadata` interceptor runs after the + `post_add_rule` interceptor. The (possibly modified) response returned by + `post_add_rule` will be passed to + `post_add_rule_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListSecurityPoliciesRequest, @@ -213,12 +236,37 @@ def post_aggregated_list( ) -> compute.SecurityPoliciesAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.SecurityPoliciesAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SecurityPoliciesAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteSecurityPolicyRequest, @@ -236,12 +284,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetSecurityPolicyRequest, @@ -259,12 +330,35 @@ def pre_get( def post_get(self, response: compute.SecurityPolicy) -> compute.SecurityPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SecurityPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_rule( self, request: compute.GetRuleSecurityPolicyRequest, @@ -284,12 +378,35 @@ def post_get_rule( ) -> compute.SecurityPolicyRule: """Post-rpc interceptor for get_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get_rule` interceptor runs + before the `post_get_rule_with_metadata` interceptor. """ return response + def post_get_rule_with_metadata( + self, + response: compute.SecurityPolicyRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicyRule, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_get_rule_with_metadata` + interceptor in new development instead of the `post_get_rule` interceptor. + When both interceptors are used, this `post_get_rule_with_metadata` interceptor runs after the + `post_get_rule` interceptor. The (possibly modified) response returned by + `post_get_rule` will be passed to + `post_get_rule_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertSecurityPolicyRequest, @@ -307,12 +424,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListSecurityPoliciesRequest, @@ -332,12 +472,35 @@ def post_list( ) -> compute.SecurityPolicyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SecurityPolicyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SecurityPolicyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_preconfigured_expression_sets( self, request: compute.ListPreconfiguredExpressionSetsSecurityPoliciesRequest, @@ -358,12 +521,38 @@ def post_list_preconfigured_expression_sets( ) -> compute.SecurityPoliciesListPreconfiguredExpressionSetsResponse: """Post-rpc interceptor for list_preconfigured_expression_sets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_preconfigured_expression_sets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list_preconfigured_expression_sets` interceptor runs + before the `post_list_preconfigured_expression_sets_with_metadata` interceptor. """ return response + def post_list_preconfigured_expression_sets_with_metadata( + self, + response: compute.SecurityPoliciesListPreconfiguredExpressionSetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SecurityPoliciesListPreconfiguredExpressionSetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_preconfigured_expression_sets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_list_preconfigured_expression_sets_with_metadata` + interceptor in new development instead of the `post_list_preconfigured_expression_sets` interceptor. + When both interceptors are used, this `post_list_preconfigured_expression_sets_with_metadata` interceptor runs after the + `post_list_preconfigured_expression_sets` interceptor. The (possibly modified) response returned by + `post_list_preconfigured_expression_sets` will be passed to + `post_list_preconfigured_expression_sets_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchSecurityPolicyRequest, @@ -381,12 +570,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_patch_rule( self, request: compute.PatchRuleSecurityPolicyRequest, @@ -404,12 +616,35 @@ def pre_patch_rule( def post_patch_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch_rule` interceptor runs + before the `post_patch_rule_with_metadata` interceptor. """ return response + def post_patch_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_rule_with_metadata` + interceptor in new development instead of the `post_patch_rule` interceptor. + When both interceptors are used, this `post_patch_rule_with_metadata` interceptor runs after the + `post_patch_rule` interceptor. The (possibly modified) response returned by + `post_patch_rule` will be passed to + `post_patch_rule_with_metadata`. + """ + return response, metadata + def pre_remove_rule( self, request: compute.RemoveRuleSecurityPolicyRequest, @@ -427,12 +662,35 @@ def pre_remove_rule( def post_remove_rule(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityPolicies server but before - it is returned to user code. + it is returned to user code. This `post_remove_rule` interceptor runs + before the `post_remove_rule_with_metadata` interceptor. """ return response + def post_remove_rule_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityPolicies server but before it is returned to user code. + + We recommend only using this `post_remove_rule_with_metadata` + interceptor in new development instead of the `post_remove_rule` interceptor. + When both interceptors are used, this `post_remove_rule_with_metadata` interceptor runs after the + `post_remove_rule` interceptor. The (possibly modified) response returned by + `post_remove_rule` will be passed to + `post_remove_rule_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsSecurityPolicyRequest, @@ -450,12 +708,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 SecurityPolicies 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 SecurityPolicies 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 + @dataclasses.dataclass class SecurityPoliciesRestStub: @@ -695,6 +976,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -837,6 +1122,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1002,6 +1291,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1152,6 +1445,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1302,6 +1597,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1473,6 +1772,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1617,6 +1920,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1768,6 +2073,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_preconfigured_expression_sets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_preconfigured_expression_sets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1939,6 +2251,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2104,6 +2420,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2263,6 +2583,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2428,6 +2752,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/client.py index 7c34bed46ae0..89457d93c343 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/service_attachments/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/transports/rest.py index 85c9177639c3..50181b41a59a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/service_attachments/transports/rest.py @@ -166,12 +166,37 @@ def post_aggregated_list( ) -> compute.ServiceAttachmentAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.ServiceAttachmentAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.ServiceAttachmentAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteServiceAttachmentRequest, @@ -189,12 +214,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetServiceAttachmentRequest, @@ -214,12 +262,35 @@ def post_get( ) -> compute.ServiceAttachment: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.ServiceAttachment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ServiceAttachment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyServiceAttachmentRequest, @@ -238,12 +309,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 ServiceAttachments 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ServiceAttachments 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_insert( self, request: compute.InsertServiceAttachmentRequest, @@ -261,12 +355,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListServiceAttachmentsRequest, @@ -286,12 +403,35 @@ def post_list( ) -> compute.ServiceAttachmentList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ServiceAttachmentList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ServiceAttachmentList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchServiceAttachmentRequest, @@ -309,12 +449,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceAttachments server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceAttachments server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyServiceAttachmentRequest, @@ -333,12 +496,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 ServiceAttachments 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 ServiceAttachments 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: compute.TestIamPermissionsServiceAttachmentRequest, @@ -359,12 +545,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 ServiceAttachments 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 ServiceAttachments 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 ServiceAttachmentsRestStub: @@ -578,6 +789,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -741,6 +956,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -895,6 +1114,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1061,6 +1282,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 @@ -1230,6 +1455,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1376,6 +1605,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1547,6 +1778,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1719,6 +1954,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 @@ -1872,6 +2111,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-compute/google/cloud/compute_v1/services/snapshot_settings_service/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/client.py index 39f1664f6682..9d8d6fe1f05d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -462,6 +464,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-compute/google/cloud/compute_v1/services/snapshot_settings_service/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/transports/rest.py index 5411c1eb79f5..ce9ddecc0120 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshot_settings_service/transports/rest.py @@ -107,12 +107,35 @@ def pre_get( def post_get(self, response: compute.SnapshotSettings) -> compute.SnapshotSettings: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SnapshotSettingsService server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SnapshotSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SnapshotSettings, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SnapshotSettingsService server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchSnapshotSettingRequest, @@ -130,12 +153,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SnapshotSettingsService server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SnapshotSettingsService server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SnapshotSettingsServiceRestStub: @@ -347,6 +393,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -513,6 +561,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/client.py index 676dd0a725a7..5077976166b4 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/snapshots/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/transports/rest.py index 80fa5237ebbe..42eb09d3128a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/snapshots/transports/rest.py @@ -153,12 +153,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Snapshots server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Snapshots server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetSnapshotRequest, @@ -174,12 +197,35 @@ def pre_get( def post_get(self, response: compute.Snapshot) -> compute.Snapshot: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Snapshots server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Snapshot, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Snapshot, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Snapshots server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicySnapshotRequest, @@ -197,12 +243,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Snapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Snapshots 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_insert( self, request: compute.InsertSnapshotRequest, @@ -218,12 +287,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Snapshots server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Snapshots server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListSnapshotsRequest, @@ -239,12 +331,35 @@ def pre_list( def post_list(self, response: compute.SnapshotList) -> compute.SnapshotList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Snapshots server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SnapshotList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SnapshotList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Snapshots server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicySnapshotRequest, @@ -262,12 +377,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Snapshots 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Snapshots 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_set_labels( self, request: compute.SetLabelsSnapshotRequest, @@ -285,12 +423,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 Snapshots 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Snapshots 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_test_iam_permissions( self, request: compute.TestIamPermissionsSnapshotRequest, @@ -311,12 +472,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Snapshots 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Snapshots 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 SnapshotsRestStub: @@ -544,6 +730,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -688,6 +878,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -857,6 +1049,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 @@ -1022,6 +1218,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1163,6 +1363,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1338,6 +1540,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 @@ -1505,6 +1711,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 @@ -1655,6 +1865,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-compute/google/cloud/compute_v1/services/ssl_certificates/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/client.py index 7da7fb9a85b2..b946857dd507 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/ssl_certificates/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/transports/rest.py index 8728a4510312..834f3ac3760a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_certificates/transports/rest.py @@ -134,12 +134,37 @@ def post_aggregated_list( ) -> compute.SslCertificateAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.SslCertificateAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SslCertificateAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslCertificates server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteSslCertificateRequest, @@ -157,12 +182,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslCertificates server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetSslCertificateRequest, @@ -180,12 +228,35 @@ def pre_get( def post_get(self, response: compute.SslCertificate) -> compute.SslCertificate: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SslCertificate, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslCertificate, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslCertificates server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertSslCertificateRequest, @@ -203,12 +274,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslCertificates server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListSslCertificatesRequest, @@ -228,12 +322,35 @@ def post_list( ) -> compute.SslCertificateList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslCertificates server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SslCertificateList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslCertificateList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslCertificates server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SslCertificatesRestStub: @@ -444,6 +561,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -609,6 +730,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -773,6 +898,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -942,6 +1069,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1088,6 +1219,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/client.py index c5e3a107dc01..e64b10fd0680 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/ssl_policies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/transports/rest.py index b04302bfa91d..41136ae161b1 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/ssl_policies/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.SslPoliciesAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.SslPoliciesAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SslPoliciesAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteSslPolicyRequest, @@ -171,12 +196,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetSslPolicyRequest, @@ -192,12 +240,35 @@ def pre_get( def post_get(self, response: compute.SslPolicy) -> compute.SslPolicy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.SslPolicy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslPolicy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertSslPolicyRequest, @@ -213,12 +284,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListSslPoliciesRequest, @@ -234,12 +328,35 @@ def pre_list( def post_list(self, response: compute.SslPoliciesList) -> compute.SslPoliciesList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SslPoliciesList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SslPoliciesList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_available_features( self, request: compute.ListAvailableFeaturesSslPoliciesRequest, @@ -260,12 +377,38 @@ def post_list_available_features( ) -> compute.SslPoliciesListAvailableFeaturesResponse: """Post-rpc interceptor for list_available_features - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_available_features_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_list_available_features` interceptor runs + before the `post_list_available_features_with_metadata` interceptor. """ return response + def post_list_available_features_with_metadata( + self, + response: compute.SslPoliciesListAvailableFeaturesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SslPoliciesListAvailableFeaturesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_available_features + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_list_available_features_with_metadata` + interceptor in new development instead of the `post_list_available_features` interceptor. + When both interceptors are used, this `post_list_available_features_with_metadata` interceptor runs after the + `post_list_available_features` interceptor. The (possibly modified) response returned by + `post_list_available_features` will be passed to + `post_list_available_features_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchSslPolicyRequest, @@ -281,12 +424,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SslPolicies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SslPolicies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SslPoliciesRestStub: @@ -497,6 +663,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -658,6 +828,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -807,6 +981,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -972,6 +1148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1114,6 +1294,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1258,6 +1440,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_available_features(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_available_features_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1427,6 +1613,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/client.py index 8f46a1cc808f..5fd50e41385b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/storage_pool_types/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/transports/rest.py index 20d3fe744250..b2eb67322cbe 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pool_types/transports/rest.py @@ -118,12 +118,37 @@ def post_aggregated_list( ) -> compute.StoragePoolTypeAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePoolTypes server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.StoragePoolTypeAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.StoragePoolTypeAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePoolTypes server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetStoragePoolTypeRequest, @@ -141,12 +166,35 @@ def pre_get( def post_get(self, response: compute.StoragePoolType) -> compute.StoragePoolType: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePoolTypes server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.StoragePoolType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.StoragePoolType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePoolTypes server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListStoragePoolTypesRequest, @@ -166,12 +214,35 @@ def post_list( ) -> compute.StoragePoolTypeList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePoolTypes server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.StoragePoolTypeList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.StoragePoolTypeList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePoolTypes server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class StoragePoolTypesRestStub: @@ -382,6 +453,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -528,6 +603,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -674,6 +751,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/client.py index 8668935c421f..e14b8e19cbc4 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/storage_pools/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/transports/rest.py index e191b4b2723f..f2c7a03ee96e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/storage_pools/transports/rest.py @@ -174,12 +174,37 @@ def post_aggregated_list( ) -> compute.StoragePoolAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.StoragePoolAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.StoragePoolAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteStoragePoolRequest, @@ -197,12 +222,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetStoragePoolRequest, @@ -218,12 +266,35 @@ def pre_get( def post_get(self, response: compute.StoragePool) -> compute.StoragePool: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.StoragePool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.StoragePool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicyStoragePoolRequest, @@ -241,12 +312,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 StoragePools 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 StoragePools 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_insert( self, request: compute.InsertStoragePoolRequest, @@ -264,12 +358,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListStoragePoolsRequest, @@ -287,12 +404,35 @@ def pre_list( def post_list(self, response: compute.StoragePoolList) -> compute.StoragePoolList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.StoragePoolList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.StoragePoolList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_disks( self, request: compute.ListDisksStoragePoolsRequest, @@ -312,12 +452,35 @@ def post_list_disks( ) -> compute.StoragePoolListDisks: """Post-rpc interceptor for list_disks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_disks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_list_disks` interceptor runs + before the `post_list_disks_with_metadata` interceptor. """ return response + def post_list_disks_with_metadata( + self, + response: compute.StoragePoolListDisks, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.StoragePoolListDisks, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_disks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_list_disks_with_metadata` + interceptor in new development instead of the `post_list_disks` interceptor. + When both interceptors are used, this `post_list_disks_with_metadata` interceptor runs after the + `post_list_disks` interceptor. The (possibly modified) response returned by + `post_list_disks` will be passed to + `post_list_disks_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicyStoragePoolRequest, @@ -335,12 +498,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 StoragePools 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 StoragePools 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: compute.TestIamPermissionsStoragePoolRequest, @@ -361,12 +547,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 StoragePools 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 StoragePools 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( self, request: compute.UpdateStoragePoolRequest, @@ -384,12 +595,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StoragePools server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StoragePools server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class StoragePoolsRestStub: @@ -600,6 +834,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -763,6 +1001,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -907,6 +1149,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1074,6 +1318,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 @@ -1241,6 +1489,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1383,6 +1635,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1529,6 +1783,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_disks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_disks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1704,6 +1962,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 @@ -1854,6 +2116,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 @@ -2021,6 +2287,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/client.py index 530fef9cea2d..9557c121d6b1 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/subnetworks/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/transports/rest.py index 227303005d92..ef4ba50e6027 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/subnetworks/transports/rest.py @@ -190,12 +190,37 @@ def post_aggregated_list( ) -> compute.SubnetworkAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.SubnetworkAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.SubnetworkAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteSubnetworkRequest, @@ -213,12 +238,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_expand_ip_cidr_range( self, request: compute.ExpandIpCidrRangeSubnetworkRequest, @@ -239,12 +287,35 @@ def post_expand_ip_cidr_range( ) -> compute.Operation: """Post-rpc interceptor for expand_ip_cidr_range - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_expand_ip_cidr_range_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_expand_ip_cidr_range` interceptor runs + before the `post_expand_ip_cidr_range_with_metadata` interceptor. """ return response + def post_expand_ip_cidr_range_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for expand_ip_cidr_range + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_expand_ip_cidr_range_with_metadata` + interceptor in new development instead of the `post_expand_ip_cidr_range` interceptor. + When both interceptors are used, this `post_expand_ip_cidr_range_with_metadata` interceptor runs after the + `post_expand_ip_cidr_range` interceptor. The (possibly modified) response returned by + `post_expand_ip_cidr_range` will be passed to + `post_expand_ip_cidr_range_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetSubnetworkRequest, @@ -260,12 +331,35 @@ def pre_get( def post_get(self, response: compute.Subnetwork) -> compute.Subnetwork: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Subnetwork, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Subnetwork, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: compute.GetIamPolicySubnetworkRequest, @@ -283,12 +377,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: compute.Policy) -> compute.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 Subnetworks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Subnetworks 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_insert( self, request: compute.InsertSubnetworkRequest, @@ -306,12 +423,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListSubnetworksRequest, @@ -327,12 +467,35 @@ def pre_list( def post_list(self, response: compute.SubnetworkList) -> compute.SubnetworkList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.SubnetworkList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.SubnetworkList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_list_usable( self, request: compute.ListUsableSubnetworksRequest, @@ -352,12 +515,37 @@ def post_list_usable( ) -> compute.UsableSubnetworksAggregatedList: """Post-rpc interceptor for list_usable - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_usable_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_list_usable` interceptor runs + before the `post_list_usable_with_metadata` interceptor. """ return response + def post_list_usable_with_metadata( + self, + response: compute.UsableSubnetworksAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.UsableSubnetworksAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_usable + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_list_usable_with_metadata` + interceptor in new development instead of the `post_list_usable` interceptor. + When both interceptors are used, this `post_list_usable_with_metadata` interceptor runs after the + `post_list_usable` interceptor. The (possibly modified) response returned by + `post_list_usable` will be passed to + `post_list_usable_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchSubnetworkRequest, @@ -373,12 +561,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: compute.SetIamPolicySubnetworkRequest, @@ -396,12 +607,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: compute.Policy) -> compute.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 Subnetworks 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: compute.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 Subnetworks 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_set_private_ip_google_access( self, request: compute.SetPrivateIpGoogleAccessSubnetworkRequest, @@ -422,12 +656,35 @@ def post_set_private_ip_google_access( ) -> compute.Operation: """Post-rpc interceptor for set_private_ip_google_access - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_private_ip_google_access_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Subnetworks server but before - it is returned to user code. + it is returned to user code. This `post_set_private_ip_google_access` interceptor runs + before the `post_set_private_ip_google_access_with_metadata` interceptor. """ return response + def post_set_private_ip_google_access_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_private_ip_google_access + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Subnetworks server but before it is returned to user code. + + We recommend only using this `post_set_private_ip_google_access_with_metadata` + interceptor in new development instead of the `post_set_private_ip_google_access` interceptor. + When both interceptors are used, this `post_set_private_ip_google_access_with_metadata` interceptor runs after the + `post_set_private_ip_google_access` interceptor. The (possibly modified) response returned by + `post_set_private_ip_google_access` will be passed to + `post_set_private_ip_google_access_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: compute.TestIamPermissionsSubnetworkRequest, @@ -448,12 +705,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 Subnetworks 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 Subnetworks 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 SubnetworksRestStub: @@ -664,6 +946,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -825,6 +1111,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -992,6 +1282,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_expand_ip_cidr_range(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_expand_ip_cidr_range_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1141,6 +1435,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1310,6 +1606,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 @@ -1475,6 +1775,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1619,6 +1923,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1765,6 +2071,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_usable(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_usable_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1932,6 +2242,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2109,6 +2423,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 @@ -2277,6 +2595,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_private_ip_google_access(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_private_ip_google_access_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2427,6 +2749,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-compute/google/cloud/compute_v1/services/target_grpc_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/client.py index 63234e4dc5b6..1b811866b90e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_grpc_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/transports/rest.py index 21bd690dd631..6f440caa4fbb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_grpc_proxies/transports/rest.py @@ -131,12 +131,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetGrpcProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetGrpcProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetGrpcProxyRequest, @@ -154,12 +177,35 @@ def pre_get( def post_get(self, response: compute.TargetGrpcProxy) -> compute.TargetGrpcProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetGrpcProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetGrpcProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetGrpcProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetGrpcProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetGrpcProxyRequest, @@ -177,12 +223,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetGrpcProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetGrpcProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetGrpcProxiesRequest, @@ -202,12 +271,35 @@ def post_list( ) -> compute.TargetGrpcProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetGrpcProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetGrpcProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetGrpcProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetGrpcProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchTargetGrpcProxyRequest, @@ -225,12 +317,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetGrpcProxies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetGrpcProxies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetGrpcProxiesRestStub: @@ -462,6 +577,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -613,6 +732,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -784,6 +905,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -930,6 +1055,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1101,6 +1228,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/client.py index 4c667adfc271..4fb5cc3e28fb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_http_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/transports/rest.py index 612fc456e2b8..27761c7a1490 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_http_proxies/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.TargetHttpProxyAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetHttpProxyAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetHttpProxyAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetHttpProxyRequest, @@ -173,12 +198,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetHttpProxyRequest, @@ -196,12 +244,35 @@ def pre_get( def post_get(self, response: compute.TargetHttpProxy) -> compute.TargetHttpProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetHttpProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetHttpProxyRequest, @@ -219,12 +290,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetHttpProxiesRequest, @@ -244,12 +338,35 @@ def post_list( ) -> compute.TargetHttpProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetHttpProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchTargetHttpProxyRequest, @@ -267,12 +384,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_url_map( self, request: compute.SetUrlMapTargetHttpProxyRequest, @@ -290,12 +430,35 @@ def pre_set_url_map( def post_set_url_map(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_url_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_url_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_url_map` interceptor runs + before the `post_set_url_map_with_metadata` interceptor. """ return response + def post_set_url_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_url_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpProxies server but before it is returned to user code. + + We recommend only using this `post_set_url_map_with_metadata` + interceptor in new development instead of the `post_set_url_map` interceptor. + When both interceptors are used, this `post_set_url_map_with_metadata` interceptor runs after the + `post_set_url_map` interceptor. The (possibly modified) response returned by + `post_set_url_map` will be passed to + `post_set_url_map_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetHttpProxiesRestStub: @@ -507,6 +670,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -672,6 +839,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -832,6 +1003,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1003,6 +1176,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1149,6 +1326,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1320,6 +1499,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1485,6 +1668,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_url_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_url_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/client.py index 1f3b423297db..75973566ca8a 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_https_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/transports/rest.py index a8e15f2f9cf4..3b76d7e57877 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_https_proxies/transports/rest.py @@ -182,12 +182,37 @@ def post_aggregated_list( ) -> compute.TargetHttpsProxyAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetHttpsProxyAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetHttpsProxyAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetHttpsProxyRequest, @@ -205,12 +230,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetHttpsProxyRequest, @@ -228,12 +276,35 @@ def pre_get( def post_get(self, response: compute.TargetHttpsProxy) -> compute.TargetHttpsProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetHttpsProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpsProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetHttpsProxyRequest, @@ -251,12 +322,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetHttpsProxiesRequest, @@ -276,12 +370,35 @@ def post_list( ) -> compute.TargetHttpsProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetHttpsProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetHttpsProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchTargetHttpsProxyRequest, @@ -299,12 +416,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_set_certificate_map( self, request: compute.SetCertificateMapTargetHttpsProxyRequest, @@ -325,12 +465,35 @@ def post_set_certificate_map( ) -> compute.Operation: """Post-rpc interceptor for set_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_certificate_map` interceptor runs + before the `post_set_certificate_map_with_metadata` interceptor. """ return response + def post_set_certificate_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_certificate_map_with_metadata` + interceptor in new development instead of the `post_set_certificate_map` interceptor. + When both interceptors are used, this `post_set_certificate_map_with_metadata` interceptor runs after the + `post_set_certificate_map` interceptor. The (possibly modified) response returned by + `post_set_certificate_map` will be passed to + `post_set_certificate_map_with_metadata`. + """ + return response, metadata + def pre_set_quic_override( self, request: compute.SetQuicOverrideTargetHttpsProxyRequest, @@ -349,12 +512,35 @@ def pre_set_quic_override( def post_set_quic_override(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_quic_override - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_quic_override_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_quic_override` interceptor runs + before the `post_set_quic_override_with_metadata` interceptor. """ return response + def post_set_quic_override_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_quic_override + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_quic_override_with_metadata` + interceptor in new development instead of the `post_set_quic_override` interceptor. + When both interceptors are used, this `post_set_quic_override_with_metadata` interceptor runs after the + `post_set_quic_override` interceptor. The (possibly modified) response returned by + `post_set_quic_override` will be passed to + `post_set_quic_override_with_metadata`. + """ + return response, metadata + def pre_set_ssl_certificates( self, request: compute.SetSslCertificatesTargetHttpsProxyRequest, @@ -375,12 +561,35 @@ def post_set_ssl_certificates( ) -> compute.Operation: """Post-rpc interceptor for set_ssl_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_ssl_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_ssl_certificates` interceptor runs + before the `post_set_ssl_certificates_with_metadata` interceptor. """ return response + def post_set_ssl_certificates_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_ssl_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_ssl_certificates_with_metadata` + interceptor in new development instead of the `post_set_ssl_certificates` interceptor. + When both interceptors are used, this `post_set_ssl_certificates_with_metadata` interceptor runs after the + `post_set_ssl_certificates` interceptor. The (possibly modified) response returned by + `post_set_ssl_certificates` will be passed to + `post_set_ssl_certificates_with_metadata`. + """ + return response, metadata + def pre_set_ssl_policy( self, request: compute.SetSslPolicyTargetHttpsProxyRequest, @@ -399,12 +608,35 @@ def pre_set_ssl_policy( def post_set_ssl_policy(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_ssl_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_ssl_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_ssl_policy` interceptor runs + before the `post_set_ssl_policy_with_metadata` interceptor. """ return response + def post_set_ssl_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_ssl_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_ssl_policy_with_metadata` + interceptor in new development instead of the `post_set_ssl_policy` interceptor. + When both interceptors are used, this `post_set_ssl_policy_with_metadata` interceptor runs after the + `post_set_ssl_policy` interceptor. The (possibly modified) response returned by + `post_set_ssl_policy` will be passed to + `post_set_ssl_policy_with_metadata`. + """ + return response, metadata + def pre_set_url_map( self, request: compute.SetUrlMapTargetHttpsProxyRequest, @@ -423,12 +655,35 @@ def pre_set_url_map( def post_set_url_map(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_url_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_url_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetHttpsProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_url_map` interceptor runs + before the `post_set_url_map_with_metadata` interceptor. """ return response + def post_set_url_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_url_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetHttpsProxies server but before it is returned to user code. + + We recommend only using this `post_set_url_map_with_metadata` + interceptor in new development instead of the `post_set_url_map` interceptor. + When both interceptors are used, this `post_set_url_map_with_metadata` interceptor runs after the + `post_set_url_map` interceptor. The (possibly modified) response returned by + `post_set_url_map` will be passed to + `post_set_url_map_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetHttpsProxiesRestStub: @@ -640,6 +895,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -803,6 +1062,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -965,6 +1228,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1134,6 +1399,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1282,6 +1551,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1453,6 +1724,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1621,6 +1896,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1789,6 +2068,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_quic_override(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_quic_override_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1959,6 +2242,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_ssl_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_ssl_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2125,6 +2412,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_ssl_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_ssl_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2290,6 +2581,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_url_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_url_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py index e04a462113be..44f1c37ffcc2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py index 95de85e6a359..5c76cbd37c0e 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_instances/transports/rest.py @@ -142,12 +142,37 @@ def post_aggregated_list( ) -> compute.TargetInstanceAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetInstanceAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetInstanceAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetInstanceRequest, @@ -165,12 +190,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetInstanceRequest, @@ -188,12 +236,35 @@ def pre_get( def post_get(self, response: compute.TargetInstance) -> compute.TargetInstance: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetInstance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetInstance, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetInstanceRequest, @@ -211,12 +282,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetInstancesRequest, @@ -236,12 +330,35 @@ def post_list( ) -> compute.TargetInstanceList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetInstanceList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetInstanceList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_security_policy( self, request: compute.SetSecurityPolicyTargetInstanceRequest, @@ -262,12 +379,35 @@ def post_set_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetInstances server but before - it is returned to user code. + it is returned to user code. This `post_set_security_policy` interceptor runs + before the `post_set_security_policy_with_metadata` interceptor. """ return response + def post_set_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetInstances server but before it is returned to user code. + + We recommend only using this `post_set_security_policy_with_metadata` + interceptor in new development instead of the `post_set_security_policy` interceptor. + When both interceptors are used, this `post_set_security_policy_with_metadata` interceptor runs after the + `post_set_security_policy` interceptor. The (possibly modified) response returned by + `post_set_security_policy` will be passed to + `post_set_security_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetInstancesRestStub: @@ -478,6 +618,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -643,6 +787,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -795,6 +943,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -964,6 +1114,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1110,6 +1264,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1278,6 +1434,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py index 0c1117991183..52278d476f2d 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py index 7797dad159a8..431730917988 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_pools/transports/rest.py @@ -187,12 +187,35 @@ def pre_add_health_check( def post_add_health_check(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_health_check - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_health_check_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_add_health_check` interceptor runs + before the `post_add_health_check_with_metadata` interceptor. """ return response + def post_add_health_check_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_health_check + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_add_health_check_with_metadata` + interceptor in new development instead of the `post_add_health_check` interceptor. + When both interceptors are used, this `post_add_health_check_with_metadata` interceptor runs after the + `post_add_health_check` interceptor. The (possibly modified) response returned by + `post_add_health_check` will be passed to + `post_add_health_check_with_metadata`. + """ + return response, metadata + def pre_add_instance( self, request: compute.AddInstanceTargetPoolRequest, @@ -210,12 +233,35 @@ def pre_add_instance( def post_add_instance(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for add_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_add_instance` interceptor runs + before the `post_add_instance_with_metadata` interceptor. """ return response + def post_add_instance_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_add_instance_with_metadata` + interceptor in new development instead of the `post_add_instance` interceptor. + When both interceptors are used, this `post_add_instance_with_metadata` interceptor runs after the + `post_add_instance` interceptor. The (possibly modified) response returned by + `post_add_instance` will be passed to + `post_add_instance_with_metadata`. + """ + return response, metadata + def pre_aggregated_list( self, request: compute.AggregatedListTargetPoolsRequest, @@ -236,12 +282,37 @@ def post_aggregated_list( ) -> compute.TargetPoolAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetPoolAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetPoolAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetPoolRequest, @@ -259,12 +330,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetPoolRequest, @@ -280,12 +374,35 @@ def pre_get( def post_get(self, response: compute.TargetPool) -> compute.TargetPool: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_health( self, request: compute.GetHealthTargetPoolRequest, @@ -305,12 +422,37 @@ def post_get_health( ) -> compute.TargetPoolInstanceHealth: """Post-rpc interceptor for get_health - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_health_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_get_health` interceptor runs + before the `post_get_health_with_metadata` interceptor. """ return response + def post_get_health_with_metadata( + self, + response: compute.TargetPoolInstanceHealth, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetPoolInstanceHealth, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_health + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_get_health_with_metadata` + interceptor in new development instead of the `post_get_health` interceptor. + When both interceptors are used, this `post_get_health_with_metadata` interceptor runs after the + `post_get_health` interceptor. The (possibly modified) response returned by + `post_get_health` will be passed to + `post_get_health_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetPoolRequest, @@ -328,12 +470,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetPoolsRequest, @@ -349,12 +514,35 @@ def pre_list( def post_list(self, response: compute.TargetPoolList) -> compute.TargetPoolList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetPoolList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetPoolList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_remove_health_check( self, request: compute.RemoveHealthCheckTargetPoolRequest, @@ -375,12 +563,35 @@ def post_remove_health_check( ) -> compute.Operation: """Post-rpc interceptor for remove_health_check - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_health_check_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_remove_health_check` interceptor runs + before the `post_remove_health_check_with_metadata` interceptor. """ return response + def post_remove_health_check_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_health_check + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_remove_health_check_with_metadata` + interceptor in new development instead of the `post_remove_health_check` interceptor. + When both interceptors are used, this `post_remove_health_check_with_metadata` interceptor runs after the + `post_remove_health_check` interceptor. The (possibly modified) response returned by + `post_remove_health_check` will be passed to + `post_remove_health_check_with_metadata`. + """ + return response, metadata + def pre_remove_instance( self, request: compute.RemoveInstanceTargetPoolRequest, @@ -398,12 +609,35 @@ def pre_remove_instance( def post_remove_instance(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for remove_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_remove_instance` interceptor runs + before the `post_remove_instance_with_metadata` interceptor. """ return response + def post_remove_instance_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_remove_instance_with_metadata` + interceptor in new development instead of the `post_remove_instance` interceptor. + When both interceptors are used, this `post_remove_instance_with_metadata` interceptor runs after the + `post_remove_instance` interceptor. The (possibly modified) response returned by + `post_remove_instance` will be passed to + `post_remove_instance_with_metadata`. + """ + return response, metadata + def pre_set_backup( self, request: compute.SetBackupTargetPoolRequest, @@ -421,12 +655,35 @@ def pre_set_backup( def post_set_backup(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_backup - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_backup_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_set_backup` interceptor runs + before the `post_set_backup_with_metadata` interceptor. """ return response + def post_set_backup_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_backup + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_set_backup_with_metadata` + interceptor in new development instead of the `post_set_backup` interceptor. + When both interceptors are used, this `post_set_backup_with_metadata` interceptor runs after the + `post_set_backup` interceptor. The (possibly modified) response returned by + `post_set_backup` will be passed to + `post_set_backup_with_metadata`. + """ + return response, metadata + def pre_set_security_policy( self, request: compute.SetSecurityPolicyTargetPoolRequest, @@ -447,12 +704,35 @@ def post_set_security_policy( ) -> compute.Operation: """Post-rpc interceptor for set_security_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_security_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetPools server but before - it is returned to user code. + it is returned to user code. This `post_set_security_policy` interceptor runs + before the `post_set_security_policy_with_metadata` interceptor. """ return response + def post_set_security_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_security_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetPools server but before it is returned to user code. + + We recommend only using this `post_set_security_policy_with_metadata` + interceptor in new development instead of the `post_set_security_policy` interceptor. + When both interceptors are used, this `post_set_security_policy_with_metadata` interceptor runs after the + `post_set_security_policy` interceptor. The (possibly modified) response returned by + `post_set_security_policy` will be passed to + `post_set_security_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetPoolsRestStub: @@ -688,6 +968,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_health_check(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_health_check_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -859,6 +1143,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1001,6 +1289,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1162,6 +1454,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1312,6 +1608,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1462,6 +1760,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_health(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_health_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1629,6 +1931,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1773,6 +2079,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1940,6 +2248,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_health_check(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_health_check_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2105,6 +2417,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2272,6 +2588,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_backup(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_backup_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2439,6 +2759,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_security_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_security_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/client.py index de9994658efa..d6ef68c4fbf2 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_ssl_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/transports/rest.py index d726f94fc0a7..5d9fac02890b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_ssl_proxies/transports/rest.py @@ -163,12 +163,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetSslProxyRequest, @@ -186,12 +209,35 @@ def pre_get( def post_get(self, response: compute.TargetSslProxy) -> compute.TargetSslProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetSslProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetSslProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetSslProxyRequest, @@ -209,12 +255,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetSslProxiesRequest, @@ -234,12 +303,35 @@ def post_list( ) -> compute.TargetSslProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetSslProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetSslProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_backend_service( self, request: compute.SetBackendServiceTargetSslProxyRequest, @@ -260,12 +352,35 @@ def post_set_backend_service( ) -> compute.Operation: """Post-rpc interceptor for set_backend_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_backend_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_backend_service` interceptor runs + before the `post_set_backend_service_with_metadata` interceptor. """ return response + def post_set_backend_service_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_backend_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_set_backend_service_with_metadata` + interceptor in new development instead of the `post_set_backend_service` interceptor. + When both interceptors are used, this `post_set_backend_service_with_metadata` interceptor runs after the + `post_set_backend_service` interceptor. The (possibly modified) response returned by + `post_set_backend_service` will be passed to + `post_set_backend_service_with_metadata`. + """ + return response, metadata + def pre_set_certificate_map( self, request: compute.SetCertificateMapTargetSslProxyRequest, @@ -286,12 +401,35 @@ def post_set_certificate_map( ) -> compute.Operation: """Post-rpc interceptor for set_certificate_map - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_certificate_map_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_certificate_map` interceptor runs + before the `post_set_certificate_map_with_metadata` interceptor. """ return response + def post_set_certificate_map_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_certificate_map + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_set_certificate_map_with_metadata` + interceptor in new development instead of the `post_set_certificate_map` interceptor. + When both interceptors are used, this `post_set_certificate_map_with_metadata` interceptor runs after the + `post_set_certificate_map` interceptor. The (possibly modified) response returned by + `post_set_certificate_map` will be passed to + `post_set_certificate_map_with_metadata`. + """ + return response, metadata + def pre_set_proxy_header( self, request: compute.SetProxyHeaderTargetSslProxyRequest, @@ -310,12 +448,35 @@ def pre_set_proxy_header( def post_set_proxy_header(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_proxy_header - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_proxy_header_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_proxy_header` interceptor runs + before the `post_set_proxy_header_with_metadata` interceptor. """ return response + def post_set_proxy_header_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_proxy_header + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_set_proxy_header_with_metadata` + interceptor in new development instead of the `post_set_proxy_header` interceptor. + When both interceptors are used, this `post_set_proxy_header_with_metadata` interceptor runs after the + `post_set_proxy_header` interceptor. The (possibly modified) response returned by + `post_set_proxy_header` will be passed to + `post_set_proxy_header_with_metadata`. + """ + return response, metadata + def pre_set_ssl_certificates( self, request: compute.SetSslCertificatesTargetSslProxyRequest, @@ -336,12 +497,35 @@ def post_set_ssl_certificates( ) -> compute.Operation: """Post-rpc interceptor for set_ssl_certificates - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_ssl_certificates_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_ssl_certificates` interceptor runs + before the `post_set_ssl_certificates_with_metadata` interceptor. """ return response + def post_set_ssl_certificates_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_ssl_certificates + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_set_ssl_certificates_with_metadata` + interceptor in new development instead of the `post_set_ssl_certificates` interceptor. + When both interceptors are used, this `post_set_ssl_certificates_with_metadata` interceptor runs after the + `post_set_ssl_certificates` interceptor. The (possibly modified) response returned by + `post_set_ssl_certificates` will be passed to + `post_set_ssl_certificates_with_metadata`. + """ + return response, metadata + def pre_set_ssl_policy( self, request: compute.SetSslPolicyTargetSslProxyRequest, @@ -360,12 +544,35 @@ def pre_set_ssl_policy( def post_set_ssl_policy(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_ssl_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_ssl_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetSslProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_ssl_policy` interceptor runs + before the `post_set_ssl_policy_with_metadata` interceptor. """ return response + def post_set_ssl_policy_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_ssl_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetSslProxies server but before it is returned to user code. + + We recommend only using this `post_set_ssl_policy_with_metadata` + interceptor in new development instead of the `post_set_ssl_policy` interceptor. + When both interceptors are used, this `post_set_ssl_policy_with_metadata` interceptor runs after the + `post_set_ssl_policy` interceptor. The (possibly modified) response returned by + `post_set_ssl_policy` will be passed to + `post_set_ssl_policy_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetSslProxiesRestStub: @@ -597,6 +804,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -749,6 +960,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -920,6 +1133,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1066,6 +1283,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1234,6 +1453,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_backend_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_backend_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1402,6 +1625,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_certificate_map(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_certificate_map_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1569,6 +1796,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_proxy_header(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_proxy_header_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1737,6 +1968,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_ssl_certificates(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_ssl_certificates_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1902,6 +2137,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_ssl_policy(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_ssl_policy_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/client.py index 64f885819f99..42a7a9f6efab 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_tcp_proxies/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/transports/rest.py index 0a829769ab5f..7622eee821bb 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_tcp_proxies/transports/rest.py @@ -150,12 +150,37 @@ def post_aggregated_list( ) -> compute.TargetTcpProxyAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetTcpProxyAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetTcpProxyAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetTcpProxyRequest, @@ -173,12 +198,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetTcpProxyRequest, @@ -196,12 +244,35 @@ def pre_get( def post_get(self, response: compute.TargetTcpProxy) -> compute.TargetTcpProxy: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetTcpProxy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetTcpProxy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetTcpProxyRequest, @@ -219,12 +290,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetTcpProxiesRequest, @@ -244,12 +338,35 @@ def post_list( ) -> compute.TargetTcpProxyList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetTcpProxyList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetTcpProxyList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_backend_service( self, request: compute.SetBackendServiceTargetTcpProxyRequest, @@ -270,12 +387,35 @@ def post_set_backend_service( ) -> compute.Operation: """Post-rpc interceptor for set_backend_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_backend_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_backend_service` interceptor runs + before the `post_set_backend_service_with_metadata` interceptor. """ return response + def post_set_backend_service_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_backend_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_set_backend_service_with_metadata` + interceptor in new development instead of the `post_set_backend_service` interceptor. + When both interceptors are used, this `post_set_backend_service_with_metadata` interceptor runs after the + `post_set_backend_service` interceptor. The (possibly modified) response returned by + `post_set_backend_service` will be passed to + `post_set_backend_service_with_metadata`. + """ + return response, metadata + def pre_set_proxy_header( self, request: compute.SetProxyHeaderTargetTcpProxyRequest, @@ -294,12 +434,35 @@ def pre_set_proxy_header( def post_set_proxy_header(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for set_proxy_header - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_proxy_header_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetTcpProxies server but before - it is returned to user code. + it is returned to user code. This `post_set_proxy_header` interceptor runs + before the `post_set_proxy_header_with_metadata` interceptor. """ return response + def post_set_proxy_header_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_proxy_header + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetTcpProxies server but before it is returned to user code. + + We recommend only using this `post_set_proxy_header_with_metadata` + interceptor in new development instead of the `post_set_proxy_header` interceptor. + When both interceptors are used, this `post_set_proxy_header_with_metadata` interceptor runs after the + `post_set_proxy_header` interceptor. The (possibly modified) response returned by + `post_set_proxy_header` will be passed to + `post_set_proxy_header_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class TargetTcpProxiesRestStub: @@ -510,6 +673,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -675,6 +842,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -827,6 +998,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -998,6 +1171,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1144,6 +1321,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1312,6 +1491,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_backend_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_backend_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1479,6 +1662,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_proxy_header(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_proxy_header_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/client.py index 62d4ce13bace..7a3779ede321 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +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-compute/google/cloud/compute_v1/services/target_vpn_gateways/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/transports/rest.py index 9d8c80468517..7f5154f4c540 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/target_vpn_gateways/transports/rest.py @@ -142,12 +142,37 @@ def post_aggregated_list( ) -> compute.TargetVpnGatewayAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.TargetVpnGatewayAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TargetVpnGatewayAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetVpnGateways server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteTargetVpnGatewayRequest, @@ -165,12 +190,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetVpnGateways server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetTargetVpnGatewayRequest, @@ -188,12 +236,35 @@ def pre_get( def post_get(self, response: compute.TargetVpnGateway) -> compute.TargetVpnGateway: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.TargetVpnGateway, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetVpnGateway, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetVpnGateways server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertTargetVpnGatewayRequest, @@ -211,12 +282,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetVpnGateways server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListTargetVpnGatewaysRequest, @@ -236,12 +330,35 @@ def post_list( ) -> compute.TargetVpnGatewayList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TargetVpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.TargetVpnGatewayList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.TargetVpnGatewayList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TargetVpnGateways server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsTargetVpnGatewayRequest, @@ -260,12 +377,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 TargetVpnGateways 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 TargetVpnGateways 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 + @dataclasses.dataclass class TargetVpnGatewaysRestStub: @@ -477,6 +617,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -642,6 +786,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -791,6 +939,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -962,6 +1112,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1110,6 +1264,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1275,6 +1431,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/client.py index d87b650b1423..8078d321645b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/url_maps/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/transports/rest.py index 17e0523837ba..4afaa6800234 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/url_maps/transports/rest.py @@ -165,12 +165,35 @@ def post_aggregated_list( ) -> compute.UrlMapsAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.UrlMapsAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.UrlMapsAggregatedList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteUrlMapRequest, @@ -186,12 +209,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetUrlMapRequest, @@ -207,12 +253,35 @@ def pre_get( def post_get(self, response: compute.UrlMap) -> compute.UrlMap: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.UrlMap, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.UrlMap, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertUrlMapRequest, @@ -228,12 +297,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_invalidate_cache( self, request: compute.InvalidateCacheUrlMapRequest, @@ -251,12 +343,35 @@ def pre_invalidate_cache( def post_invalidate_cache(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for invalidate_cache - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_invalidate_cache_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_invalidate_cache` interceptor runs + before the `post_invalidate_cache_with_metadata` interceptor. """ return response + def post_invalidate_cache_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for invalidate_cache + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_invalidate_cache_with_metadata` + interceptor in new development instead of the `post_invalidate_cache` interceptor. + When both interceptors are used, this `post_invalidate_cache_with_metadata` interceptor runs after the + `post_invalidate_cache` interceptor. The (possibly modified) response returned by + `post_invalidate_cache` will be passed to + `post_invalidate_cache_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListUrlMapsRequest, @@ -272,12 +387,35 @@ def pre_list( def post_list(self, response: compute.UrlMapList) -> compute.UrlMapList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.UrlMapList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.UrlMapList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_patch( self, request: compute.PatchUrlMapRequest, @@ -293,12 +431,35 @@ def pre_patch( def post_patch(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for patch - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_patch_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_patch` interceptor runs + before the `post_patch_with_metadata` interceptor. """ return response + def post_patch_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for patch + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_patch_with_metadata` + interceptor in new development instead of the `post_patch` interceptor. + When both interceptors are used, this `post_patch_with_metadata` interceptor runs after the + `post_patch` interceptor. The (possibly modified) response returned by + `post_patch` will be passed to + `post_patch_with_metadata`. + """ + return response, metadata + def pre_update( self, request: compute.UpdateUrlMapRequest, @@ -314,12 +475,35 @@ def pre_update( def post_update(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for update - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_update` interceptor runs + before the `post_update_with_metadata` interceptor. """ return response + def post_update_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_update_with_metadata` + interceptor in new development instead of the `post_update` interceptor. + When both interceptors are used, this `post_update_with_metadata` interceptor runs after the + `post_update` interceptor. The (possibly modified) response returned by + `post_update` will be passed to + `post_update_with_metadata`. + """ + return response, metadata + def pre_validate( self, request: compute.ValidateUrlMapRequest, @@ -337,12 +521,37 @@ def post_validate( ) -> compute.UrlMapsValidateResponse: """Post-rpc interceptor for validate - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the UrlMaps server but before - it is returned to user code. + it is returned to user code. This `post_validate` interceptor runs + before the `post_validate_with_metadata` interceptor. """ return response + def post_validate_with_metadata( + self, + response: compute.UrlMapsValidateResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.UrlMapsValidateResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for validate + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the UrlMaps server but before it is returned to user code. + + We recommend only using this `post_validate_with_metadata` + interceptor in new development instead of the `post_validate` interceptor. + When both interceptors are used, this `post_validate_with_metadata` interceptor runs after the + `post_validate` interceptor. The (possibly modified) response returned by + `post_validate` will be passed to + `post_validate_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class UrlMapsRestStub: @@ -557,6 +766,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -713,6 +926,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -877,6 +1094,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1039,6 +1258,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1212,6 +1435,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_invalidate_cache(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_invalidate_cache_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1351,6 +1578,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1513,6 +1742,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_patch(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_patch_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1675,6 +1908,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1823,6 +2060,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_validate(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_validate_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/client.py index 5cbd8d054495..9fadc8136bc4 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/vpn_gateways/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/transports/rest.py index 281b1961ab98..4bcdd29c0b0b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_gateways/transports/rest.py @@ -158,12 +158,37 @@ def post_aggregated_list( ) -> compute.VpnGatewayAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.VpnGatewayAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.VpnGatewayAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteVpnGatewayRequest, @@ -181,12 +206,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetVpnGatewayRequest, @@ -202,12 +250,35 @@ def pre_get( def post_get(self, response: compute.VpnGateway) -> compute.VpnGateway: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.VpnGateway, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.VpnGateway, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_get_status( self, request: compute.GetStatusVpnGatewayRequest, @@ -227,12 +298,37 @@ def post_get_status( ) -> compute.VpnGatewaysGetStatusResponse: """Post-rpc interceptor for get_status - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_status_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_get_status` interceptor runs + before the `post_get_status_with_metadata` interceptor. """ return response + def post_get_status_with_metadata( + self, + response: compute.VpnGatewaysGetStatusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.VpnGatewaysGetStatusResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_status + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_get_status_with_metadata` + interceptor in new development instead of the `post_get_status` interceptor. + When both interceptors are used, this `post_get_status_with_metadata` interceptor runs after the + `post_get_status` interceptor. The (possibly modified) response returned by + `post_get_status` will be passed to + `post_get_status_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertVpnGatewayRequest, @@ -250,12 +346,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListVpnGatewaysRequest, @@ -271,12 +390,35 @@ def pre_list( def post_list(self, response: compute.VpnGatewayList) -> compute.VpnGatewayList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnGateways server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.VpnGatewayList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.VpnGatewayList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnGateways server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsVpnGatewayRequest, @@ -294,12 +436,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 VpnGateways 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 VpnGateways 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_test_iam_permissions( self, request: compute.TestIamPermissionsVpnGatewayRequest, @@ -320,12 +485,37 @@ def post_test_iam_permissions( ) -> compute.TestPermissionsResponse: """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 VpnGateways 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: compute.TestPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.TestPermissionsResponse, 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 VpnGateways 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 VpnGatewaysRestStub: @@ -536,6 +726,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -697,6 +891,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -848,6 +1046,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -992,6 +1192,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_status(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_status_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1159,6 +1363,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1303,6 +1511,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1470,6 +1680,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 @@ -1620,6 +1834,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-compute/google/cloud/compute_v1/services/vpn_tunnels/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/client.py index d1413f8e1425..9cf67bdce2f7 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/client.py @@ -15,6 +15,8 @@ # from collections import OrderedDict import functools +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -459,6 +461,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-compute/google/cloud/compute_v1/services/vpn_tunnels/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/transports/rest.py index 22611696f5a3..18057ae4b29b 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/vpn_tunnels/transports/rest.py @@ -141,12 +141,37 @@ def post_aggregated_list( ) -> compute.VpnTunnelAggregatedList: """Post-rpc interceptor for aggregated_list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_aggregated_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnTunnels server but before - it is returned to user code. + it is returned to user code. This `post_aggregated_list` interceptor runs + before the `post_aggregated_list_with_metadata` interceptor. """ return response + def post_aggregated_list_with_metadata( + self, + response: compute.VpnTunnelAggregatedList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.VpnTunnelAggregatedList, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for aggregated_list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnTunnels server but before it is returned to user code. + + We recommend only using this `post_aggregated_list_with_metadata` + interceptor in new development instead of the `post_aggregated_list` interceptor. + When both interceptors are used, this `post_aggregated_list_with_metadata` interceptor runs after the + `post_aggregated_list` interceptor. The (possibly modified) response returned by + `post_aggregated_list` will be passed to + `post_aggregated_list_with_metadata`. + """ + return response, metadata + def pre_delete( self, request: compute.DeleteVpnTunnelRequest, @@ -162,12 +187,35 @@ def pre_delete( def post_delete(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnTunnels server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnTunnels server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetVpnTunnelRequest, @@ -183,12 +231,35 @@ def pre_get( def post_get(self, response: compute.VpnTunnel) -> compute.VpnTunnel: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnTunnels server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.VpnTunnel, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.VpnTunnel, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnTunnels server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_insert( self, request: compute.InsertVpnTunnelRequest, @@ -204,12 +275,35 @@ def pre_insert( def post_insert(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for insert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_insert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnTunnels server but before - it is returned to user code. + it is returned to user code. This `post_insert` interceptor runs + before the `post_insert_with_metadata` interceptor. """ return response + def post_insert_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for insert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnTunnels server but before it is returned to user code. + + We recommend only using this `post_insert_with_metadata` + interceptor in new development instead of the `post_insert` interceptor. + When both interceptors are used, this `post_insert_with_metadata` interceptor runs after the + `post_insert` interceptor. The (possibly modified) response returned by + `post_insert` will be passed to + `post_insert_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListVpnTunnelsRequest, @@ -225,12 +319,35 @@ def pre_list( def post_list(self, response: compute.VpnTunnelList) -> compute.VpnTunnelList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the VpnTunnels server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.VpnTunnelList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.VpnTunnelList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the VpnTunnels server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_set_labels( self, request: compute.SetLabelsVpnTunnelRequest, @@ -248,12 +365,35 @@ def pre_set_labels( def post_set_labels(self, response: compute.Operation) -> compute.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 VpnTunnels 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: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.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 VpnTunnels 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 + @dataclasses.dataclass class VpnTunnelsRestStub: @@ -466,6 +606,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_aggregated_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_aggregated_list_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -625,6 +769,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -767,6 +915,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -932,6 +1082,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_insert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_insert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1076,6 +1230,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1243,6 +1399,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 diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/client.py index 25206835ba0d..7f124e78fa59 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/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 @@ -458,6 +460,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-compute/google/cloud/compute_v1/services/zone_operations/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/transports/rest.py index 669067058e57..f58e438d5b84 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/zone_operations/transports/rest.py @@ -125,12 +125,37 @@ def post_delete( ) -> compute.DeleteZoneOperationResponse: """Post-rpc interceptor for delete - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ZoneOperations server but before - it is returned to user code. + it is returned to user code. This `post_delete` interceptor runs + before the `post_delete_with_metadata` interceptor. """ return response + def post_delete_with_metadata( + self, + response: compute.DeleteZoneOperationResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + compute.DeleteZoneOperationResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for delete + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ZoneOperations server but before it is returned to user code. + + We recommend only using this `post_delete_with_metadata` + interceptor in new development instead of the `post_delete` interceptor. + When both interceptors are used, this `post_delete_with_metadata` interceptor runs after the + `post_delete` interceptor. The (possibly modified) response returned by + `post_delete` will be passed to + `post_delete_with_metadata`. + """ + return response, metadata + def pre_get( self, request: compute.GetZoneOperationRequest, @@ -148,12 +173,35 @@ def pre_get( def post_get(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ZoneOperations server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ZoneOperations server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListZoneOperationsRequest, @@ -171,12 +219,35 @@ def pre_list( def post_list(self, response: compute.OperationList) -> compute.OperationList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ZoneOperations server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.OperationList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.OperationList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ZoneOperations server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + def pre_wait( self, request: compute.WaitZoneOperationRequest, @@ -194,12 +265,35 @@ def pre_wait( def post_wait(self, response: compute.Operation) -> compute.Operation: """Post-rpc interceptor for wait - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_wait_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ZoneOperations server but before - it is returned to user code. + it is returned to user code. This `post_wait` interceptor runs + before the `post_wait_with_metadata` interceptor. """ return response + def post_wait_with_metadata( + self, + response: compute.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for wait + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ZoneOperations server but before it is returned to user code. + + We recommend only using this `post_wait_with_metadata` + interceptor in new development instead of the `post_wait` interceptor. + When both interceptors are used, this `post_wait_with_metadata` interceptor runs after the + `post_wait` interceptor. The (possibly modified) response returned by + `post_wait` will be passed to + `post_wait_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ZoneOperationsRestStub: @@ -415,6 +509,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -576,6 +674,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -722,6 +822,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -883,6 +985,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_wait(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_wait_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/client.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/client.py index 57a60c0dbd86..1cdad25daac5 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/client.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/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 @@ -456,6 +458,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-compute/google/cloud/compute_v1/services/zones/transports/rest.py b/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/transports/rest.py index 9c3c7f7aceb2..98bb435ed8e3 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/transports/rest.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/services/zones/transports/rest.py @@ -105,12 +105,33 @@ def pre_get( def post_get(self, response: compute.Zone) -> compute.Zone: """Post-rpc interceptor for get - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Zones server but before - it is returned to user code. + it is returned to user code. This `post_get` interceptor runs + before the `post_get_with_metadata` interceptor. """ return response + def post_get_with_metadata( + self, response: compute.Zone, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[compute.Zone, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Zones server but before it is returned to user code. + + We recommend only using this `post_get_with_metadata` + interceptor in new development instead of the `post_get` interceptor. + When both interceptors are used, this `post_get_with_metadata` interceptor runs after the + `post_get` interceptor. The (possibly modified) response returned by + `post_get` will be passed to + `post_get_with_metadata`. + """ + return response, metadata + def pre_list( self, request: compute.ListZonesRequest, @@ -126,12 +147,35 @@ def pre_list( def post_list(self, response: compute.ZoneList) -> compute.ZoneList: """Post-rpc interceptor for list - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Zones server but before - it is returned to user code. + it is returned to user code. This `post_list` interceptor runs + before the `post_list_with_metadata` interceptor. """ return response + def post_list_with_metadata( + self, + response: compute.ZoneList, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[compute.ZoneList, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Zones server but before it is returned to user code. + + We recommend only using this `post_list_with_metadata` + interceptor in new development instead of the `post_list` interceptor. + When both interceptors are used, this `post_list_with_metadata` interceptor runs after the + `post_list` interceptor. The (possibly modified) response returned by + `post_list` will be passed to + `post_list_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ZonesRestStub: @@ -345,6 +389,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -484,6 +530,8 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_with_metadata(resp, response_metadata) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py b/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py index 38f7bc0a5fd6..3da4c79a12ae 100644 --- a/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py +++ b/packages/google-cloud-compute/google/cloud/compute_v1/types/compute.py @@ -18817,6 +18817,8 @@ class Type(proto.Enum): No description available. ACCELERATOR_OPTIMIZED_A3_MEGA (156517459): No description available. + ACCELERATOR_OPTIMIZED_A3_ULTRA (27812811): + No description available. COMPUTE_OPTIMIZED (158349023): No description available. COMPUTE_OPTIMIZED_C2D (383246453): @@ -18864,6 +18866,7 @@ class Type(proto.Enum): ACCELERATOR_OPTIMIZED = 280848403 ACCELERATOR_OPTIMIZED_A3 = 158574526 ACCELERATOR_OPTIMIZED_A3_MEGA = 156517459 + ACCELERATOR_OPTIMIZED_A3_ULTRA = 27812811 COMPUTE_OPTIMIZED = 158349023 COMPUTE_OPTIMIZED_C2D = 383246453 COMPUTE_OPTIMIZED_C3 = 428004784 @@ -90880,6 +90883,13 @@ class Scheduling(proto.Message): attached to the instance. This field is a member of `oneof`_ ``_availability_domain``. + host_error_timeout_seconds (int): + Specify the time in seconds for host error detection, the + value must be within the range of [90, 330] with the + increment of 30, if unset, the default behavior of host + error recovery will be used. + + This field is a member of `oneof`_ ``_host_error_timeout_seconds``. instance_termination_action (str): Specifies the termination action for the instance. Check the InstanceTerminationAction @@ -91030,6 +91040,11 @@ class ProvisioningModel(proto.Enum): number=252514344, optional=True, ) + host_error_timeout_seconds: int = proto.Field( + proto.INT32, + number=408317459, + optional=True, + ) instance_termination_action: str = proto.Field( proto.STRING, number=107380667, diff --git a/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json b/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json index 31c44ed71359..b6dba6ed06c0 100644 --- a/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json +++ b/packages/google-cloud-compute/samples/generated_samples/snippet_metadata_google.cloud.compute.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-compute", - "version": "1.24.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_accelerator_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_accelerator_types.py index 332b851fa082..a19fed862fb2 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_accelerator_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_accelerator_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 +320,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 = AcceleratorTypesClient(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 = AcceleratorTypesClient(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", [ @@ -1835,10 +1885,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.AcceleratorTypesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListAcceleratorTypesRequest.pb( compute.AggregatedListAcceleratorTypesRequest() ) @@ -1864,6 +1917,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AcceleratorTypeAggregatedList() + post_with_metadata.return_value = ( + compute.AcceleratorTypeAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -1875,6 +1932,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetAcceleratorTypeRequest): @@ -1979,10 +2037,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.AcceleratorTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAcceleratorTypeRequest.pb( compute.GetAcceleratorTypeRequest() ) @@ -2006,6 +2067,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AcceleratorType() + post_with_metadata.return_value = compute.AcceleratorType(), metadata client.get( request, @@ -2017,6 +2079,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListAcceleratorTypesRequest): @@ -2105,10 +2168,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.AcceleratorTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AcceleratorTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAcceleratorTypesRequest.pb( compute.ListAcceleratorTypesRequest() ) @@ -2134,6 +2200,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AcceleratorTypeList() + post_with_metadata.return_value = compute.AcceleratorTypeList(), metadata client.list( request, @@ -2145,6 +2212,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_addresses.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py index c31ef30aa987..68abd1e8f751 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_addresses.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -294,6 +301,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AddressesClient(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 = AddressesClient(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", [ @@ -3462,10 +3512,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListAddressesRequest.pb( compute.AggregatedListAddressesRequest() ) @@ -3491,6 +3544,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AddressAggregatedList() + post_with_metadata.return_value = compute.AddressAggregatedList(), metadata client.aggregated_list( request, @@ -3502,6 +3556,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteAddressRequest): @@ -3624,10 +3679,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteAddressRequest.pb(compute.DeleteAddressRequest()) transcode.return_value = { "method": "post", @@ -3649,6 +3707,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3660,6 +3719,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetAddressRequest): @@ -3776,10 +3836,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAddressRequest.pb(compute.GetAddressRequest()) transcode.return_value = { "method": "post", @@ -3801,6 +3864,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Address() + post_with_metadata.return_value = compute.Address(), metadata client.get( request, @@ -3812,6 +3876,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertAddressRequest): @@ -4023,10 +4088,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertAddressRequest.pb(compute.InsertAddressRequest()) transcode.return_value = { "method": "post", @@ -4048,6 +4116,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4059,6 +4128,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListAddressesRequest): @@ -4145,10 +4215,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAddressesRequest.pb(compute.ListAddressesRequest()) transcode.return_value = { "method": "post", @@ -4170,6 +4243,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AddressList() + post_with_metadata.return_value = compute.AddressList(), metadata client.list( request, @@ -4181,6 +4255,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_rest_bad_request(request_type=compute.MoveAddressRequest): @@ -4385,10 +4460,13 @@ def test_move_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_move" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_move_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_move" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.MoveAddressRequest.pb(compute.MoveAddressRequest()) transcode.return_value = { "method": "post", @@ -4410,6 +4488,7 @@ def test_move_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.move( request, @@ -4421,6 +4500,7 @@ def test_move_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=compute.SetLabelsAddressRequest): @@ -4622,10 +4702,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AddressesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.AddressesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AddressesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsAddressRequest.pb( compute.SetLabelsAddressRequest() ) @@ -4649,6 +4732,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4660,6 +4744,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_autoscalers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_autoscalers.py index e8db5d6b4b18..8a33c1a9cc7d 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_autoscalers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_autoscalers.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = AutoscalersClient(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 = AutoscalersClient(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", [ @@ -3483,10 +3533,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListAutoscalersRequest.pb( compute.AggregatedListAutoscalersRequest() ) @@ -3512,6 +3565,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AutoscalerAggregatedList() + post_with_metadata.return_value = compute.AutoscalerAggregatedList(), metadata client.aggregated_list( request, @@ -3523,6 +3577,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteAutoscalerRequest): @@ -3647,10 +3702,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteAutoscalerRequest.pb( compute.DeleteAutoscalerRequest() ) @@ -3674,6 +3732,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3685,6 +3744,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetAutoscalerRequest): @@ -3787,10 +3847,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAutoscalerRequest.pb(compute.GetAutoscalerRequest()) transcode.return_value = { "method": "post", @@ -3812,6 +3875,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Autoscaler() + post_with_metadata.return_value = compute.Autoscaler(), metadata client.get( request, @@ -3823,6 +3887,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertAutoscalerRequest): @@ -4058,10 +4123,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertAutoscalerRequest.pb( compute.InsertAutoscalerRequest() ) @@ -4085,6 +4153,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4096,6 +4165,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListAutoscalersRequest): @@ -4184,10 +4254,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAutoscalersRequest.pb(compute.ListAutoscalersRequest()) transcode.return_value = { "method": "post", @@ -4209,6 +4282,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AutoscalerList() + post_with_metadata.return_value = compute.AutoscalerList(), metadata client.list( request, @@ -4220,6 +4294,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchAutoscalerRequest): @@ -4455,10 +4530,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchAutoscalerRequest.pb(compute.PatchAutoscalerRequest()) transcode.return_value = { "method": "post", @@ -4480,6 +4558,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4491,6 +4570,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateAutoscalerRequest): @@ -4726,10 +4806,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AutoscalersRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.AutoscalersRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AutoscalersRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateAutoscalerRequest.pb( compute.UpdateAutoscalerRequest() ) @@ -4753,6 +4836,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -4764,6 +4848,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_backend_buckets.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_buckets.py index 5acf61735682..e30d89bb8acd 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_buckets.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_buckets.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = BackendBucketsClient(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 = BackendBucketsClient(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", [ @@ -5129,10 +5179,14 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_add_signed_url_key" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, + "post_add_signed_url_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_add_signed_url_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddSignedUrlKeyBackendBucketRequest.pb( compute.AddSignedUrlKeyBackendBucketRequest() ) @@ -5156,6 +5210,7 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_signed_url_key( request, @@ -5167,6 +5222,7 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteBackendBucketRequest): @@ -5291,10 +5347,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteBackendBucketRequest.pb( compute.DeleteBackendBucketRequest() ) @@ -5318,6 +5377,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5329,6 +5389,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_signed_url_key_rest_bad_request( @@ -5455,10 +5516,14 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_delete_signed_url_key" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, + "post_delete_signed_url_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_delete_signed_url_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSignedUrlKeyBackendBucketRequest.pb( compute.DeleteSignedUrlKeyBackendBucketRequest() ) @@ -5482,6 +5547,7 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_signed_url_key( request, @@ -5493,6 +5559,7 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetBackendBucketRequest): @@ -5595,10 +5662,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetBackendBucketRequest.pb( compute.GetBackendBucketRequest() ) @@ -5622,6 +5692,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendBucket() + post_with_metadata.return_value = compute.BackendBucket(), metadata client.get( request, @@ -5633,6 +5704,7 @@ def test_get_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( @@ -5721,10 +5793,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyBackendBucketRequest.pb( compute.GetIamPolicyBackendBucketRequest() ) @@ -5748,6 +5823,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -5759,6 +5835,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_insert_rest_bad_request(request_type=compute.InsertBackendBucketRequest): @@ -5997,10 +6074,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertBackendBucketRequest.pb( compute.InsertBackendBucketRequest() ) @@ -6024,6 +6104,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -6035,6 +6116,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListBackendBucketsRequest): @@ -6123,10 +6205,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListBackendBucketsRequest.pb( compute.ListBackendBucketsRequest() ) @@ -6150,6 +6235,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendBucketList() + post_with_metadata.return_value = compute.BackendBucketList(), metadata client.list( request, @@ -6161,6 +6247,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchBackendBucketRequest): @@ -6399,10 +6486,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchBackendBucketRequest.pb( compute.PatchBackendBucketRequest() ) @@ -6426,6 +6516,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6437,6 +6528,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_edge_security_policy_rest_bad_request( @@ -6641,10 +6733,14 @@ def test_set_edge_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_set_edge_security_policy" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, + "post_set_edge_security_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_set_edge_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetEdgeSecurityPolicyBackendBucketRequest.pb( compute.SetEdgeSecurityPolicyBackendBucketRequest() ) @@ -6668,6 +6764,7 @@ def test_set_edge_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_edge_security_policy( request, @@ -6679,6 +6776,7 @@ def test_set_edge_security_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( @@ -6883,10 +6981,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyBackendBucketRequest.pb( compute.SetIamPolicyBackendBucketRequest() ) @@ -6910,6 +7011,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -6921,6 +7023,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( @@ -7083,10 +7186,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsBackendBucketRequest.pb( compute.TestIamPermissionsBackendBucketRequest() ) @@ -7112,6 +7219,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -7123,6 +7231,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_update_rest_bad_request(request_type=compute.UpdateBackendBucketRequest): @@ -7361,10 +7470,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendBucketsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.BackendBucketsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendBucketsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateBackendBucketRequest.pb( compute.UpdateBackendBucketRequest() ) @@ -7388,6 +7500,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -7399,6 +7512,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_backend_services.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_services.py index 2a066c7451bd..4a229f6d7de6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_services.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_backend_services.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = BackendServicesClient(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 = BackendServicesClient(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", [ @@ -6301,10 +6351,14 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_add_signed_url_key" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, + "post_add_signed_url_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_add_signed_url_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddSignedUrlKeyBackendServiceRequest.pb( compute.AddSignedUrlKeyBackendServiceRequest() ) @@ -6328,6 +6382,7 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_signed_url_key( request, @@ -6339,6 +6394,7 @@ def test_add_signed_url_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -6431,10 +6487,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListBackendServicesRequest.pb( compute.AggregatedListBackendServicesRequest() ) @@ -6460,6 +6519,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceAggregatedList() + post_with_metadata.return_value = ( + compute.BackendServiceAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -6471,6 +6534,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteBackendServiceRequest): @@ -6595,10 +6659,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteBackendServiceRequest.pb( compute.DeleteBackendServiceRequest() ) @@ -6622,6 +6689,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -6633,6 +6701,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_signed_url_key_rest_bad_request( @@ -6759,10 +6828,14 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_delete_signed_url_key" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, + "post_delete_signed_url_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_delete_signed_url_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSignedUrlKeyBackendServiceRequest.pb( compute.DeleteSignedUrlKeyBackendServiceRequest() ) @@ -6786,6 +6859,7 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_signed_url_key( request, @@ -6797,6 +6871,7 @@ def test_delete_signed_url_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetBackendServiceRequest): @@ -6931,10 +7006,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetBackendServiceRequest.pb( compute.GetBackendServiceRequest() ) @@ -6958,6 +7036,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendService() + post_with_metadata.return_value = compute.BackendService(), metadata client.get( request, @@ -6969,6 +7048,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_health_rest_bad_request( @@ -7129,10 +7209,13 @@ def test_get_health_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_get_health" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_get_health_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_get_health" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetHealthBackendServiceRequest.pb( compute.GetHealthBackendServiceRequest() ) @@ -7158,6 +7241,7 @@ def test_get_health_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceGroupHealth() + post_with_metadata.return_value = compute.BackendServiceGroupHealth(), metadata client.get_health( request, @@ -7169,6 +7253,7 @@ def test_get_health_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( @@ -7257,10 +7342,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyBackendServiceRequest.pb( compute.GetIamPolicyBackendServiceRequest() ) @@ -7284,6 +7372,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -7295,6 +7384,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_insert_rest_bad_request(request_type=compute.InsertBackendServiceRequest): @@ -7660,10 +7750,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertBackendServiceRequest.pb( compute.InsertBackendServiceRequest() ) @@ -7687,6 +7780,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -7698,6 +7792,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListBackendServicesRequest): @@ -7786,10 +7881,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListBackendServicesRequest.pb( compute.ListBackendServicesRequest() ) @@ -7813,6 +7911,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceList() + post_with_metadata.return_value = compute.BackendServiceList(), metadata client.list( request, @@ -7824,6 +7923,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_usable_rest_bad_request( @@ -7914,10 +8014,13 @@ def test_list_usable_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_list_usable" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_list_usable_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_list_usable" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListUsableBackendServicesRequest.pb( compute.ListUsableBackendServicesRequest() ) @@ -7943,6 +8046,7 @@ def test_list_usable_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceListUsable() + post_with_metadata.return_value = compute.BackendServiceListUsable(), metadata client.list_usable( request, @@ -7954,6 +8058,7 @@ def test_list_usable_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchBackendServiceRequest): @@ -8319,10 +8424,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchBackendServiceRequest.pb( compute.PatchBackendServiceRequest() ) @@ -8346,6 +8454,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -8357,6 +8466,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_edge_security_policy_rest_bad_request( @@ -8561,10 +8671,14 @@ def test_set_edge_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_set_edge_security_policy" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, + "post_set_edge_security_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_set_edge_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetEdgeSecurityPolicyBackendServiceRequest.pb( compute.SetEdgeSecurityPolicyBackendServiceRequest() ) @@ -8588,6 +8702,7 @@ def test_set_edge_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_edge_security_policy( request, @@ -8599,6 +8714,7 @@ def test_set_edge_security_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( @@ -8803,10 +8919,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyBackendServiceRequest.pb( compute.SetIamPolicyBackendServiceRequest() ) @@ -8830,6 +8949,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -8841,6 +8961,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_set_security_policy_rest_bad_request( @@ -9045,10 +9166,14 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_set_security_policy" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, + "post_set_security_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_set_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSecurityPolicyBackendServiceRequest.pb( compute.SetSecurityPolicyBackendServiceRequest() ) @@ -9072,6 +9197,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_security_policy( request, @@ -9083,6 +9209,7 @@ def test_set_security_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( @@ -9245,10 +9372,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsBackendServiceRequest.pb( compute.TestIamPermissionsBackendServiceRequest() ) @@ -9274,6 +9405,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -9285,6 +9417,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_update_rest_bad_request(request_type=compute.UpdateBackendServiceRequest): @@ -9650,10 +9783,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.BackendServicesRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.BackendServicesRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.BackendServicesRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateBackendServiceRequest.pb( compute.UpdateBackendServiceRequest() ) @@ -9677,6 +9813,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -9688,6 +9825,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_disk_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disk_types.py index cc53d755d9cf..ccd4a1b640b7 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disk_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disk_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -287,6 +294,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 = DiskTypesClient(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 = DiskTypesClient(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", [ @@ -1781,10 +1831,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiskTypesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.DiskTypesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiskTypesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListDiskTypesRequest.pb( compute.AggregatedListDiskTypesRequest() ) @@ -1810,6 +1863,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskTypeAggregatedList() + post_with_metadata.return_value = compute.DiskTypeAggregatedList(), metadata client.aggregated_list( request, @@ -1821,6 +1875,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetDiskTypeRequest): @@ -1919,10 +1974,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiskTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.DiskTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiskTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetDiskTypeRequest.pb(compute.GetDiskTypeRequest()) transcode.return_value = { "method": "post", @@ -1944,6 +2002,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskType() + post_with_metadata.return_value = compute.DiskType(), metadata client.get( request, @@ -1955,6 +2014,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListDiskTypesRequest): @@ -2041,10 +2101,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DiskTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.DiskTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DiskTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListDiskTypesRequest.pb(compute.ListDiskTypesRequest()) transcode.return_value = { "method": "post", @@ -2066,6 +2129,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskTypeList() + post_with_metadata.return_value = compute.DiskTypeList(), metadata client.list( request, @@ -2077,6 +2141,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_disks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disks.py index 0e0ca05287c5..0a68c2492925 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_disks.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.disks import DisksClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -275,6 +282,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 = DisksClient(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 = DisksClient(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", [ @@ -7621,10 +7671,13 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_add_resource_policies" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_add_resource_policies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_add_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddResourcePoliciesDiskRequest.pb( compute.AddResourcePoliciesDiskRequest() ) @@ -7648,6 +7701,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_resource_policies( request, @@ -7659,6 +7713,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -7749,10 +7804,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListDisksRequest.pb( compute.AggregatedListDisksRequest() ) @@ -7776,6 +7834,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskAggregatedList() + post_with_metadata.return_value = compute.DiskAggregatedList(), metadata client.aggregated_list( request, @@ -7787,6 +7846,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_insert_rest_bad_request(request_type=compute.BulkInsertDiskRequest): @@ -7987,10 +8047,13 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_bulk_insert" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_bulk_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_bulk_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.BulkInsertDiskRequest.pb(compute.BulkInsertDiskRequest()) transcode.return_value = { "method": "post", @@ -8012,6 +8075,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.bulk_insert( request, @@ -8023,6 +8087,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_snapshot_rest_bad_request( @@ -8258,10 +8323,13 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_create_snapshot" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_create_snapshot_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_create_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CreateSnapshotDiskRequest.pb( compute.CreateSnapshotDiskRequest() ) @@ -8285,6 +8353,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.create_snapshot( request, @@ -8296,6 +8365,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteDiskRequest): @@ -8418,10 +8488,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteDiskRequest.pb(compute.DeleteDiskRequest()) transcode.return_value = { "method": "post", @@ -8443,6 +8516,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -8454,6 +8528,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetDiskRequest): @@ -8620,10 +8695,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetDiskRequest.pb(compute.GetDiskRequest()) transcode.return_value = { "method": "post", @@ -8645,6 +8723,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Disk() + post_with_metadata.return_value = compute.Disk(), metadata client.get( request, @@ -8656,6 +8735,7 @@ def test_get_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(request_type=compute.GetIamPolicyDiskRequest): @@ -8740,10 +8820,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyDiskRequest.pb( compute.GetIamPolicyDiskRequest() ) @@ -8767,6 +8850,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -8778,6 +8862,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_insert_rest_bad_request(request_type=compute.InsertDiskRequest): @@ -9033,10 +9118,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertDiskRequest.pb(compute.InsertDiskRequest()) transcode.return_value = { "method": "post", @@ -9058,6 +9146,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -9069,6 +9158,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListDisksRequest): @@ -9155,10 +9245,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListDisksRequest.pb(compute.ListDisksRequest()) transcode.return_value = { "method": "post", @@ -9180,6 +9273,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskList() + post_with_metadata.return_value = compute.DiskList(), metadata client.list( request, @@ -9191,6 +9285,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_resource_policies_rest_bad_request( @@ -9400,10 +9495,13 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_remove_resource_policies" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_remove_resource_policies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_remove_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveResourcePoliciesDiskRequest.pb( compute.RemoveResourcePoliciesDiskRequest() ) @@ -9427,6 +9525,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_resource_policies( request, @@ -9438,6 +9537,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resize_rest_bad_request(request_type=compute.ResizeDiskRequest): @@ -9634,10 +9734,13 @@ def test_resize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_resize" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_resize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_resize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResizeDiskRequest.pb(compute.ResizeDiskRequest()) transcode.return_value = { "method": "post", @@ -9659,6 +9762,7 @@ def test_resize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resize( request, @@ -9670,6 +9774,7 @@ def test_resize_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(request_type=compute.SetIamPolicyDiskRequest): @@ -9870,10 +9975,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyDiskRequest.pb( compute.SetIamPolicyDiskRequest() ) @@ -9897,6 +10005,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -9908,6 +10017,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_set_labels_rest_bad_request(request_type=compute.SetLabelsDiskRequest): @@ -10109,10 +10219,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsDiskRequest.pb(compute.SetLabelsDiskRequest()) transcode.return_value = { "method": "post", @@ -10134,6 +10247,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -10145,6 +10259,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_start_async_replication_rest_bad_request( @@ -10354,10 +10469,13 @@ def test_start_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_start_async_replication" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_start_async_replication_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_start_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartAsyncReplicationDiskRequest.pb( compute.StartAsyncReplicationDiskRequest() ) @@ -10381,6 +10499,7 @@ def test_start_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start_async_replication( request, @@ -10392,6 +10511,7 @@ def test_start_async_replication_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_async_replication_rest_bad_request( @@ -10516,10 +10636,13 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_stop_async_replication" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_stop_async_replication_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_stop_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopAsyncReplicationDiskRequest.pb( compute.StopAsyncReplicationDiskRequest() ) @@ -10543,6 +10666,7 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_async_replication( request, @@ -10554,6 +10678,7 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_group_async_replication_rest_bad_request( @@ -10763,10 +10888,14 @@ def test_stop_group_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_stop_group_async_replication" ) as post, mock.patch.object( + transports.DisksRestInterceptor, + "post_stop_group_async_replication_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_stop_group_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopGroupAsyncReplicationDiskRequest.pb( compute.StopGroupAsyncReplicationDiskRequest() ) @@ -10790,6 +10919,7 @@ def test_stop_group_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_group_async_replication( request, @@ -10801,6 +10931,7 @@ def test_stop_group_async_replication_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( @@ -10961,10 +11092,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsDiskRequest.pb( compute.TestIamPermissionsDiskRequest() ) @@ -10990,6 +11124,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -11001,6 +11136,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_update_rest_bad_request(request_type=compute.UpdateDiskRequest): @@ -11256,10 +11392,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.DisksRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.DisksRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.DisksRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateDiskRequest.pb(compute.UpdateDiskRequest()) transcode.return_value = { "method": "post", @@ -11281,6 +11420,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -11292,6 +11432,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_external_vpn_gateways.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_external_vpn_gateways.py index 052b17cf0be6..2cc67015768e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_external_vpn_gateways.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_external_vpn_gateways.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = ExternalVpnGatewaysClient(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 = ExternalVpnGatewaysClient(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", [ @@ -3002,10 +3052,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteExternalVpnGatewayRequest.pb( compute.DeleteExternalVpnGatewayRequest() ) @@ -3029,6 +3082,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3040,6 +3094,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetExternalVpnGatewayRequest): @@ -3136,10 +3191,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetExternalVpnGatewayRequest.pb( compute.GetExternalVpnGatewayRequest() ) @@ -3163,6 +3221,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ExternalVpnGateway() + post_with_metadata.return_value = compute.ExternalVpnGateway(), metadata client.get( request, @@ -3174,6 +3233,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertExternalVpnGatewayRequest): @@ -3391,10 +3451,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertExternalVpnGatewayRequest.pb( compute.InsertExternalVpnGatewayRequest() ) @@ -3418,6 +3481,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3429,6 +3493,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListExternalVpnGatewaysRequest): @@ -3519,10 +3584,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListExternalVpnGatewaysRequest.pb( compute.ListExternalVpnGatewaysRequest() ) @@ -3548,6 +3616,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ExternalVpnGatewayList() + post_with_metadata.return_value = compute.ExternalVpnGatewayList(), metadata client.list( request, @@ -3559,6 +3628,7 @@ def test_list_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( @@ -3764,10 +3834,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsExternalVpnGatewayRequest.pb( compute.SetLabelsExternalVpnGatewayRequest() ) @@ -3791,6 +3864,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -3802,6 +3876,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_test_iam_permissions_rest_bad_request( @@ -3964,10 +4039,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ExternalVpnGatewaysRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ExternalVpnGatewaysRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsExternalVpnGatewayRequest.pb( compute.TestIamPermissionsExternalVpnGatewayRequest() ) @@ -3993,6 +4072,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4004,6 +4084,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewall_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewall_policies.py index d84d086889d4..a62bd4efc062 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewall_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewall_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = FirewallPoliciesClient(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 = FirewallPoliciesClient(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", [ @@ -6533,10 +6583,13 @@ def test_add_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_add_association" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_add_association_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_add_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddAssociationFirewallPolicyRequest.pb( compute.AddAssociationFirewallPolicyRequest() ) @@ -6560,6 +6613,7 @@ def test_add_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_association( request, @@ -6571,6 +6625,7 @@ def test_add_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_rule_rest_bad_request(request_type=compute.AddRuleFirewallPolicyRequest): @@ -6823,10 +6878,13 @@ def test_add_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_add_rule" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_add_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_add_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddRuleFirewallPolicyRequest.pb( compute.AddRuleFirewallPolicyRequest() ) @@ -6850,6 +6908,7 @@ def test_add_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_rule( request, @@ -6861,6 +6920,7 @@ def test_add_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_clone_rules_rest_bad_request( @@ -6987,10 +7047,13 @@ def test_clone_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_clone_rules" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_clone_rules_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_clone_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CloneRulesFirewallPolicyRequest.pb( compute.CloneRulesFirewallPolicyRequest() ) @@ -7014,6 +7077,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.clone_rules( request, @@ -7025,6 +7089,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteFirewallPolicyRequest): @@ -7149,10 +7214,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteFirewallPolicyRequest.pb( compute.DeleteFirewallPolicyRequest() ) @@ -7176,6 +7244,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -7187,6 +7256,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetFirewallPolicyRequest): @@ -7293,10 +7363,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetFirewallPolicyRequest.pb( compute.GetFirewallPolicyRequest() ) @@ -7320,6 +7393,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicy() + post_with_metadata.return_value = compute.FirewallPolicy(), metadata client.get( request, @@ -7331,6 +7405,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_association_rest_bad_request( @@ -7423,10 +7498,13 @@ def test_get_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_get_association" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_get_association_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_get_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAssociationFirewallPolicyRequest.pb( compute.GetAssociationFirewallPolicyRequest() ) @@ -7452,6 +7530,7 @@ def test_get_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyAssociation() + post_with_metadata.return_value = compute.FirewallPolicyAssociation(), metadata client.get_association( request, @@ -7463,6 +7542,7 @@ def test_get_association_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( @@ -7551,10 +7631,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyFirewallPolicyRequest.pb( compute.GetIamPolicyFirewallPolicyRequest() ) @@ -7578,6 +7661,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -7589,6 +7673,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_get_rule_rest_bad_request(request_type=compute.GetRuleFirewallPolicyRequest): @@ -7695,10 +7780,13 @@ def test_get_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_get_rule" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_get_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_get_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRuleFirewallPolicyRequest.pb( compute.GetRuleFirewallPolicyRequest() ) @@ -7722,6 +7810,7 @@ def test_get_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyRule() + post_with_metadata.return_value = compute.FirewallPolicyRule(), metadata client.get_rule( request, @@ -7733,6 +7822,7 @@ def test_get_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertFirewallPolicyRequest): @@ -8016,10 +8106,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertFirewallPolicyRequest.pb( compute.InsertFirewallPolicyRequest() ) @@ -8043,6 +8136,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -8054,6 +8148,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListFirewallPoliciesRequest): @@ -8140,10 +8235,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListFirewallPoliciesRequest.pb( compute.ListFirewallPoliciesRequest() ) @@ -8167,6 +8265,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyList() + post_with_metadata.return_value = compute.FirewallPolicyList(), metadata client.list( request, @@ -8178,6 +8277,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_associations_rest_bad_request( @@ -8262,10 +8362,14 @@ def test_list_associations_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_list_associations" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, + "post_list_associations_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_list_associations" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAssociationsFirewallPolicyRequest.pb( compute.ListAssociationsFirewallPolicyRequest() ) @@ -8291,6 +8395,10 @@ def test_list_associations_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPoliciesListAssociationsResponse() + post_with_metadata.return_value = ( + compute.FirewallPoliciesListAssociationsResponse(), + metadata, + ) client.list_associations( request, @@ -8302,6 +8410,7 @@ def test_list_associations_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_rest_bad_request(request_type=compute.MoveFirewallPolicyRequest): @@ -8426,10 +8535,13 @@ def test_move_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_move" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_move_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_move" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.MoveFirewallPolicyRequest.pb( compute.MoveFirewallPolicyRequest() ) @@ -8453,6 +8565,7 @@ def test_move_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.move( request, @@ -8464,6 +8577,7 @@ def test_move_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchFirewallPolicyRequest): @@ -8747,10 +8861,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchFirewallPolicyRequest.pb( compute.PatchFirewallPolicyRequest() ) @@ -8774,6 +8891,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -8785,6 +8903,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rule_rest_bad_request( @@ -9039,10 +9158,13 @@ def test_patch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_patch_rule" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_patch_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_patch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRuleFirewallPolicyRequest.pb( compute.PatchRuleFirewallPolicyRequest() ) @@ -9066,6 +9188,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_rule( request, @@ -9077,6 +9200,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_association_rest_bad_request( @@ -9203,10 +9327,14 @@ def test_remove_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_remove_association" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, + "post_remove_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_remove_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveAssociationFirewallPolicyRequest.pb( compute.RemoveAssociationFirewallPolicyRequest() ) @@ -9230,6 +9358,7 @@ def test_remove_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_association( request, @@ -9241,6 +9370,7 @@ def test_remove_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_rule_rest_bad_request( @@ -9367,10 +9497,13 @@ def test_remove_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_remove_rule" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_remove_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_remove_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveRuleFirewallPolicyRequest.pb( compute.RemoveRuleFirewallPolicyRequest() ) @@ -9394,6 +9527,7 @@ def test_remove_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_rule( request, @@ -9405,6 +9539,7 @@ def test_remove_rule_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( @@ -9616,10 +9751,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyFirewallPolicyRequest.pb( compute.SetIamPolicyFirewallPolicyRequest() ) @@ -9643,6 +9781,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -9654,6 +9793,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( @@ -9816,10 +9956,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.FirewallPoliciesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.FirewallPoliciesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsFirewallPolicyRequest.pb( compute.TestIamPermissionsFirewallPolicyRequest() ) @@ -9845,6 +9989,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -9856,6 +10001,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewalls.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewalls.py index 5eb85a6aabb7..5d7b8af739fa 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewalls.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_firewalls.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -294,6 +301,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = FirewallsClient(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 = FirewallsClient(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", [ @@ -3125,10 +3175,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteFirewallRequest.pb(compute.DeleteFirewallRequest()) transcode.return_value = { "method": "post", @@ -3150,6 +3203,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3161,6 +3215,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetFirewallRequest): @@ -3271,10 +3326,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetFirewallRequest.pb(compute.GetFirewallRequest()) transcode.return_value = { "method": "post", @@ -3296,6 +3354,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Firewall() + post_with_metadata.return_value = compute.Firewall(), metadata client.get( request, @@ -3307,6 +3366,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertFirewallRequest): @@ -3536,10 +3596,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertFirewallRequest.pb(compute.InsertFirewallRequest()) transcode.return_value = { "method": "post", @@ -3561,6 +3624,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3572,6 +3636,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListFirewallsRequest): @@ -3658,10 +3723,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListFirewallsRequest.pb(compute.ListFirewallsRequest()) transcode.return_value = { "method": "post", @@ -3683,6 +3751,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallList() + post_with_metadata.return_value = compute.FirewallList(), metadata client.list( request, @@ -3694,6 +3763,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchFirewallRequest): @@ -3923,10 +3993,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchFirewallRequest.pb(compute.PatchFirewallRequest()) transcode.return_value = { "method": "post", @@ -3948,6 +4021,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -3959,6 +4033,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateFirewallRequest): @@ -4188,10 +4263,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.FirewallsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.FirewallsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.FirewallsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateFirewallRequest.pb(compute.UpdateFirewallRequest()) transcode.return_value = { "method": "post", @@ -4213,6 +4291,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -4224,6 +4303,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_forwarding_rules.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_forwarding_rules.py index 618f63aa6044..018fb06863c6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_forwarding_rules.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_forwarding_rules.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ForwardingRulesClient(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 = ForwardingRulesClient(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", [ @@ -3954,10 +4004,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListForwardingRulesRequest.pb( compute.AggregatedListForwardingRulesRequest() ) @@ -3983,6 +4036,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ForwardingRuleAggregatedList() + post_with_metadata.return_value = ( + compute.ForwardingRuleAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3994,6 +4051,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteForwardingRuleRequest): @@ -4126,10 +4184,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteForwardingRuleRequest.pb( compute.DeleteForwardingRuleRequest() ) @@ -4153,6 +4214,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4164,6 +4226,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetForwardingRuleRequest): @@ -4316,10 +4379,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetForwardingRuleRequest.pb( compute.GetForwardingRuleRequest() ) @@ -4343,6 +4409,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ForwardingRule() + post_with_metadata.return_value = compute.ForwardingRule(), metadata client.get( request, @@ -4354,6 +4421,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertForwardingRuleRequest): @@ -4597,10 +4665,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertForwardingRuleRequest.pb( compute.InsertForwardingRuleRequest() ) @@ -4624,6 +4695,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4635,6 +4707,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListForwardingRulesRequest): @@ -4723,10 +4796,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListForwardingRulesRequest.pb( compute.ListForwardingRulesRequest() ) @@ -4750,6 +4826,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ForwardingRuleList() + post_with_metadata.return_value = compute.ForwardingRuleList(), metadata client.list( request, @@ -4761,6 +4838,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchForwardingRuleRequest): @@ -5012,10 +5090,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchForwardingRuleRequest.pb( compute.PatchForwardingRuleRequest() ) @@ -5039,6 +5120,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -5050,6 +5132,7 @@ def test_patch_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( @@ -5255,10 +5338,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsForwardingRuleRequest.pb( compute.SetLabelsForwardingRuleRequest() ) @@ -5282,6 +5368,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -5293,6 +5380,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_target_rest_bad_request( @@ -5501,10 +5589,13 @@ def test_set_target_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ForwardingRulesRestInterceptor, "post_set_target" ) as post, mock.patch.object( + transports.ForwardingRulesRestInterceptor, "post_set_target_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ForwardingRulesRestInterceptor, "pre_set_target" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetTargetForwardingRuleRequest.pb( compute.SetTargetForwardingRuleRequest() ) @@ -5528,6 +5619,7 @@ def test_set_target_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_target( request, @@ -5539,6 +5631,7 @@ def test_set_target_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-compute/tests/unit/gapic/compute_v1/test_global_addresses.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py index d22d485d5bce..164215519287 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_addresses.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = GlobalAddressesClient(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 = GlobalAddressesClient(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", [ @@ -3166,10 +3216,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalAddressRequest.pb( compute.DeleteGlobalAddressRequest() ) @@ -3193,6 +3246,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3204,6 +3258,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetGlobalAddressRequest): @@ -3322,10 +3377,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalAddressRequest.pb( compute.GetGlobalAddressRequest() ) @@ -3349,6 +3407,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Address() + post_with_metadata.return_value = compute.Address(), metadata client.get( request, @@ -3360,6 +3419,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertGlobalAddressRequest): @@ -3573,10 +3633,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertGlobalAddressRequest.pb( compute.InsertGlobalAddressRequest() ) @@ -3600,6 +3663,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3611,6 +3675,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListGlobalAddressesRequest): @@ -3699,10 +3764,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalAddressesRequest.pb( compute.ListGlobalAddressesRequest() ) @@ -3726,6 +3794,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.AddressList() + post_with_metadata.return_value = compute.AddressList(), metadata client.list( request, @@ -3737,6 +3806,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_rest_bad_request(request_type=compute.MoveGlobalAddressRequest): @@ -3943,10 +4013,13 @@ def test_move_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_move" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_move_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_move" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.MoveGlobalAddressRequest.pb( compute.MoveGlobalAddressRequest() ) @@ -3970,6 +4043,7 @@ def test_move_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.move( request, @@ -3981,6 +4055,7 @@ def test_move_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( @@ -4186,10 +4261,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalAddressesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.GlobalAddressesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalAddressesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsGlobalAddressRequest.pb( compute.SetLabelsGlobalAddressRequest() ) @@ -4213,6 +4291,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4224,6 +4303,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_forwarding_rules.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_forwarding_rules.py index 558cfa26346e..3628e9ec38c3 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_forwarding_rules.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_forwarding_rules.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = GlobalForwardingRulesClient(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 = GlobalForwardingRulesClient(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", [ @@ -3620,10 +3670,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalForwardingRuleRequest.pb( compute.DeleteGlobalForwardingRuleRequest() ) @@ -3647,6 +3700,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3658,6 +3712,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetGlobalForwardingRuleRequest): @@ -3802,10 +3857,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalForwardingRuleRequest.pb( compute.GetGlobalForwardingRuleRequest() ) @@ -3829,6 +3887,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ForwardingRule() + post_with_metadata.return_value = compute.ForwardingRule(), metadata client.get( request, @@ -3840,6 +3899,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4085,10 +4145,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertGlobalForwardingRuleRequest.pb( compute.InsertGlobalForwardingRuleRequest() ) @@ -4112,6 +4175,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4123,6 +4187,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListGlobalForwardingRulesRequest): @@ -4211,10 +4276,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalForwardingRulesRequest.pb( compute.ListGlobalForwardingRulesRequest() ) @@ -4238,6 +4306,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ForwardingRuleList() + post_with_metadata.return_value = compute.ForwardingRuleList(), metadata client.list( request, @@ -4249,6 +4318,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchGlobalForwardingRuleRequest): @@ -4492,10 +4562,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchGlobalForwardingRuleRequest.pb( compute.PatchGlobalForwardingRuleRequest() ) @@ -4519,6 +4592,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4530,6 +4604,7 @@ def test_patch_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( @@ -4735,10 +4810,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsGlobalForwardingRuleRequest.pb( compute.SetLabelsGlobalForwardingRuleRequest() ) @@ -4762,6 +4840,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4773,6 +4852,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_target_rest_bad_request( @@ -4973,10 +5053,13 @@ def test_set_target_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "post_set_target" ) as post, mock.patch.object( + transports.GlobalForwardingRulesRestInterceptor, "post_set_target_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalForwardingRulesRestInterceptor, "pre_set_target" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetTargetGlobalForwardingRuleRequest.pb( compute.SetTargetGlobalForwardingRuleRequest() ) @@ -5000,6 +5083,7 @@ def test_set_target_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_target( request, @@ -5011,6 +5095,7 @@ def test_set_target_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-compute/tests/unit/gapic/compute_v1/test_global_network_endpoint_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_network_endpoint_groups.py index 260428d94e47..3c86edee23d6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_network_endpoint_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_network_endpoint_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = GlobalNetworkEndpointGroupsClient(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 = GlobalNetworkEndpointGroupsClient(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", [ @@ -3657,11 +3707,15 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_attach_network_endpoints", ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, + "post_attach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_attach_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AttachNetworkEndpointsGlobalNetworkEndpointGroupRequest.pb( compute.AttachNetworkEndpointsGlobalNetworkEndpointGroupRequest() ) @@ -3685,6 +3739,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.attach_network_endpoints( request, @@ -3696,6 +3751,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3822,10 +3878,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalNetworkEndpointGroupRequest.pb( compute.DeleteGlobalNetworkEndpointGroupRequest() ) @@ -3849,6 +3909,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3860,6 +3921,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_detach_network_endpoints_rest_bad_request( @@ -4084,11 +4146,15 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_detach_network_endpoints", ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, + "post_detach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_detach_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DetachNetworkEndpointsGlobalNetworkEndpointGroupRequest.pb( compute.DetachNetworkEndpointsGlobalNetworkEndpointGroupRequest() ) @@ -4112,6 +4178,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.detach_network_endpoints( request, @@ -4123,6 +4190,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -4233,10 +4301,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalNetworkEndpointGroupRequest.pb( compute.GetGlobalNetworkEndpointGroupRequest() ) @@ -4262,6 +4333,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroup() + post_with_metadata.return_value = compute.NetworkEndpointGroup(), metadata client.get( request, @@ -4273,6 +4345,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4508,10 +4581,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertGlobalNetworkEndpointGroupRequest.pb( compute.InsertGlobalNetworkEndpointGroupRequest() ) @@ -4535,6 +4612,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4546,6 +4624,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -4636,10 +4715,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalNetworkEndpointGroupsRequest.pb( compute.ListGlobalNetworkEndpointGroupsRequest() ) @@ -4665,6 +4747,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupList() + post_with_metadata.return_value = compute.NetworkEndpointGroupList(), metadata client.list( request, @@ -4676,6 +4759,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_network_endpoints_rest_bad_request( @@ -4767,11 +4851,15 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): transports.GlobalNetworkEndpointGroupsRestInterceptor, "post_list_network_endpoints", ) as post, mock.patch.object( + transports.GlobalNetworkEndpointGroupsRestInterceptor, + "post_list_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalNetworkEndpointGroupsRestInterceptor, "pre_list_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkEndpointsGlobalNetworkEndpointGroupsRequest.pb( compute.ListNetworkEndpointsGlobalNetworkEndpointGroupsRequest() ) @@ -4797,6 +4885,10 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupsListNetworkEndpoints() + post_with_metadata.return_value = ( + compute.NetworkEndpointGroupsListNetworkEndpoints(), + metadata, + ) client.list_network_endpoints( request, @@ -4808,6 +4900,7 @@ def test_list_network_endpoints_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-compute/tests/unit/gapic/compute_v1/test_global_operations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_operations.py index eb967c15a5ef..253dbeea20fc 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_operations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_operations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 +320,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 = GlobalOperationsClient(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 = GlobalOperationsClient(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", [ @@ -2188,10 +2238,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOperationsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.GlobalOperationsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOperationsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListGlobalOperationsRequest.pb( compute.AggregatedListGlobalOperationsRequest() ) @@ -2217,6 +2270,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.OperationAggregatedList() + post_with_metadata.return_value = compute.OperationAggregatedList(), metadata client.aggregated_list( request, @@ -2228,6 +2282,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteGlobalOperationRequest): @@ -2307,10 +2362,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOperationsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalOperationsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOperationsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalOperationRequest.pb( compute.DeleteGlobalOperationRequest() ) @@ -2336,6 +2394,10 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DeleteGlobalOperationResponse() + post_with_metadata.return_value = ( + compute.DeleteGlobalOperationResponse(), + metadata, + ) client.delete( request, @@ -2347,6 +2409,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetGlobalOperationRequest): @@ -2471,10 +2534,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOperationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalOperationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOperationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalOperationRequest.pb( compute.GetGlobalOperationRequest() ) @@ -2498,6 +2564,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.get( request, @@ -2509,6 +2576,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListGlobalOperationsRequest): @@ -2597,10 +2665,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOperationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalOperationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOperationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalOperationsRequest.pb( compute.ListGlobalOperationsRequest() ) @@ -2624,6 +2695,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.OperationList() + post_with_metadata.return_value = compute.OperationList(), metadata client.list( request, @@ -2635,6 +2707,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_wait_rest_bad_request(request_type=compute.WaitGlobalOperationRequest): @@ -2759,10 +2832,13 @@ def test_wait_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOperationsRestInterceptor, "post_wait" ) as post, mock.patch.object( + transports.GlobalOperationsRestInterceptor, "post_wait_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOperationsRestInterceptor, "pre_wait" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.WaitGlobalOperationRequest.pb( compute.WaitGlobalOperationRequest() ) @@ -2786,6 +2862,7 @@ def test_wait_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.wait( request, @@ -2797,6 +2874,7 @@ def test_wait_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-compute/tests/unit/gapic/compute_v1/test_global_organization_operations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_organization_operations.py index 8b95225d51aa..9668de44c98a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_organization_operations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_organization_operations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 = GlobalOrganizationOperationsClient(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 = GlobalOrganizationOperationsClient(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", [ @@ -1583,10 +1633,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalOrganizationOperationsRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalOrganizationOperationRequest.pb( compute.DeleteGlobalOrganizationOperationRequest() ) @@ -1612,6 +1666,10 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DeleteGlobalOrganizationOperationResponse() + post_with_metadata.return_value = ( + compute.DeleteGlobalOrganizationOperationResponse(), + metadata, + ) client.delete( request, @@ -1623,6 +1681,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -1749,10 +1808,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalOrganizationOperationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalOrganizationOperationRequest.pb( compute.GetGlobalOrganizationOperationRequest() ) @@ -1776,6 +1838,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.get( request, @@ -1787,6 +1850,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -1877,10 +1941,14 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalOrganizationOperationsRestInterceptor, + "post_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalOrganizationOperationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalOrganizationOperationsRequest.pb( compute.ListGlobalOrganizationOperationsRequest() ) @@ -1904,6 +1972,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.OperationList() + post_with_metadata.return_value = compute.OperationList(), metadata client.list( request, @@ -1915,6 +1984,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_global_public_delegated_prefixes.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_public_delegated_prefixes.py index e6f045d7de82..325eb0bc9c3b 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_public_delegated_prefixes.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_global_public_delegated_prefixes.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -348,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 = GlobalPublicDelegatedPrefixesClient(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 = GlobalPublicDelegatedPrefixesClient(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", [ @@ -2832,10 +2882,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.GlobalPublicDelegatedPrefixesRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteGlobalPublicDelegatedPrefixeRequest.pb( compute.DeleteGlobalPublicDelegatedPrefixeRequest() ) @@ -2859,6 +2913,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2870,6 +2925,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -2982,10 +3038,14 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.GlobalPublicDelegatedPrefixesRestInterceptor, + "post_get_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGlobalPublicDelegatedPrefixeRequest.pb( compute.GetGlobalPublicDelegatedPrefixeRequest() ) @@ -3011,6 +3071,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicDelegatedPrefix() + post_with_metadata.return_value = compute.PublicDelegatedPrefix(), metadata client.get( request, @@ -3022,6 +3083,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -3253,10 +3315,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.GlobalPublicDelegatedPrefixesRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertGlobalPublicDelegatedPrefixeRequest.pb( compute.InsertGlobalPublicDelegatedPrefixeRequest() ) @@ -3280,6 +3346,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3291,6 +3358,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -3381,10 +3449,14 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.GlobalPublicDelegatedPrefixesRestInterceptor, + "post_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListGlobalPublicDelegatedPrefixesRequest.pb( compute.ListGlobalPublicDelegatedPrefixesRequest() ) @@ -3410,6 +3482,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicDelegatedPrefixList() + post_with_metadata.return_value = compute.PublicDelegatedPrefixList(), metadata client.list( request, @@ -3421,6 +3494,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -3652,10 +3726,14 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.GlobalPublicDelegatedPrefixesRestInterceptor, + "post_patch_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.GlobalPublicDelegatedPrefixesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchGlobalPublicDelegatedPrefixeRequest.pb( compute.PatchGlobalPublicDelegatedPrefixeRequest() ) @@ -3679,6 +3757,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -3690,6 +3769,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_health_checks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_health_checks.py index bb08eab4a608..d45c01e7b2ae 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_health_checks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_health_checks.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = HealthChecksClient(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 = HealthChecksClient(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", [ @@ -3367,10 +3417,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListHealthChecksRequest.pb( compute.AggregatedListHealthChecksRequest() ) @@ -3396,6 +3449,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthChecksAggregatedList() + post_with_metadata.return_value = compute.HealthChecksAggregatedList(), metadata client.aggregated_list( request, @@ -3407,6 +3461,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteHealthCheckRequest): @@ -3531,10 +3586,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteHealthCheckRequest.pb( compute.DeleteHealthCheckRequest() ) @@ -3558,6 +3616,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3569,6 +3628,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetHealthCheckRequest): @@ -3675,10 +3735,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetHealthCheckRequest.pb(compute.GetHealthCheckRequest()) transcode.return_value = { "method": "post", @@ -3700,6 +3763,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheck() + post_with_metadata.return_value = compute.HealthCheck(), metadata client.get( request, @@ -3711,6 +3775,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertHealthCheckRequest): @@ -3969,10 +4034,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertHealthCheckRequest.pb( compute.InsertHealthCheckRequest() ) @@ -3996,6 +4064,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4007,6 +4076,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListHealthChecksRequest): @@ -4095,10 +4165,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListHealthChecksRequest.pb( compute.ListHealthChecksRequest() ) @@ -4122,6 +4195,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheckList() + post_with_metadata.return_value = compute.HealthCheckList(), metadata client.list( request, @@ -4133,6 +4207,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchHealthCheckRequest): @@ -4391,10 +4466,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchHealthCheckRequest.pb( compute.PatchHealthCheckRequest() ) @@ -4418,6 +4496,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4429,6 +4508,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateHealthCheckRequest): @@ -4687,10 +4767,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.HealthChecksRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.HealthChecksRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.HealthChecksRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateHealthCheckRequest.pb( compute.UpdateHealthCheckRequest() ) @@ -4714,6 +4797,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -4725,6 +4809,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_image_family_views.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_image_family_views.py index 035cf135c323..8438ad351d07 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_image_family_views.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_image_family_views.py @@ -58,6 +58,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -312,6 +319,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 = ImageFamilyViewsClient(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 = ImageFamilyViewsClient(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", [ @@ -1270,10 +1320,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImageFamilyViewsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ImageFamilyViewsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImageFamilyViewsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetImageFamilyViewRequest.pb( compute.GetImageFamilyViewRequest() ) @@ -1297,6 +1350,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ImageFamilyView() + post_with_metadata.return_value = compute.ImageFamilyView(), metadata client.get( request, @@ -1308,6 +1362,7 @@ def test_get_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-compute/tests/unit/gapic/compute_v1/test_images.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_images.py index 22530a0379cb..ce83cd72024f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_images.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_images.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.images import ImagesClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -279,6 +286,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 = ImagesClient(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 = ImagesClient(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", [ @@ -4307,10 +4357,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteImageRequest.pb(compute.DeleteImageRequest()) transcode.return_value = { "method": "post", @@ -4332,6 +4385,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4343,6 +4397,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_deprecate_rest_bad_request(request_type=compute.DeprecateImageRequest): @@ -4545,10 +4600,13 @@ def test_deprecate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_deprecate" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_deprecate_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_deprecate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeprecateImageRequest.pb(compute.DeprecateImageRequest()) transcode.return_value = { "method": "post", @@ -4570,6 +4628,7 @@ def test_deprecate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.deprecate( request, @@ -4581,6 +4640,7 @@ def test_deprecate_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetImageRequest): @@ -4709,10 +4769,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetImageRequest.pb(compute.GetImageRequest()) transcode.return_value = { "method": "post", @@ -4734,6 +4797,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Image() + post_with_metadata.return_value = compute.Image(), metadata client.get( request, @@ -4745,6 +4809,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_from_family_rest_bad_request( @@ -4875,10 +4940,13 @@ def test_get_from_family_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_get_from_family" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_get_from_family_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_get_from_family" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetFromFamilyImageRequest.pb( compute.GetFromFamilyImageRequest() ) @@ -4902,6 +4970,7 @@ def test_get_from_family_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Image() + post_with_metadata.return_value = compute.Image(), metadata client.get_from_family( request, @@ -4913,6 +4982,7 @@ def test_get_from_family_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(request_type=compute.GetIamPolicyImageRequest): @@ -4997,10 +5067,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyImageRequest.pb( compute.GetIamPolicyImageRequest() ) @@ -5024,6 +5097,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -5035,6 +5109,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_insert_rest_bad_request(request_type=compute.InsertImageRequest): @@ -5281,10 +5356,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertImageRequest.pb(compute.InsertImageRequest()) transcode.return_value = { "method": "post", @@ -5306,6 +5384,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5317,6 +5396,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListImagesRequest): @@ -5403,10 +5483,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListImagesRequest.pb(compute.ListImagesRequest()) transcode.return_value = { "method": "post", @@ -5428,6 +5511,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ImageList() + post_with_metadata.return_value = compute.ImageList(), metadata client.list( request, @@ -5439,6 +5523,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchImageRequest): @@ -5685,10 +5770,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchImageRequest.pb(compute.PatchImageRequest()) transcode.return_value = { "method": "post", @@ -5710,6 +5798,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -5721,6 +5810,7 @@ def test_patch_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(request_type=compute.SetIamPolicyImageRequest): @@ -5921,10 +6011,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyImageRequest.pb( compute.SetIamPolicyImageRequest() ) @@ -5948,6 +6041,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5959,6 +6053,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_set_labels_rest_bad_request(request_type=compute.SetLabelsImageRequest): @@ -6160,10 +6255,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsImageRequest.pb(compute.SetLabelsImageRequest()) transcode.return_value = { "method": "post", @@ -6185,6 +6283,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -6196,6 +6295,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_test_iam_permissions_rest_bad_request( @@ -6356,10 +6456,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ImagesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ImagesRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ImagesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsImageRequest.pb( compute.TestIamPermissionsImageRequest() ) @@ -6385,6 +6488,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -6396,6 +6500,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_manager_resize_requests.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_manager_resize_requests.py index 708ce99d3b33..a790def08ef4 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_manager_resize_requests.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_manager_resize_requests.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -354,6 +361,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = InstanceGroupManagerResizeRequestsClient(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 = InstanceGroupManagerResizeRequestsClient(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", [ @@ -3000,10 +3050,14 @@ def test_cancel_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "post_cancel" ) as post, mock.patch.object( + transports.InstanceGroupManagerResizeRequestsRestInterceptor, + "post_cancel_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "pre_cancel" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CancelInstanceGroupManagerResizeRequestRequest.pb( compute.CancelInstanceGroupManagerResizeRequestRequest() ) @@ -3027,6 +3081,7 @@ def test_cancel_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.cancel( request, @@ -3038,6 +3093,7 @@ def test_cancel_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3174,10 +3230,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstanceGroupManagerResizeRequestsRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstanceGroupManagerResizeRequestRequest.pb( compute.DeleteInstanceGroupManagerResizeRequestRequest() ) @@ -3201,6 +3261,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3212,6 +3273,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -3324,10 +3386,14 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstanceGroupManagerResizeRequestsRestInterceptor, + "post_get_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceGroupManagerResizeRequestRequest.pb( compute.GetInstanceGroupManagerResizeRequestRequest() ) @@ -3353,6 +3419,10 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagerResizeRequest() + post_with_metadata.return_value = ( + compute.InstanceGroupManagerResizeRequest(), + metadata, + ) client.get( request, @@ -3364,6 +3434,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -3634,10 +3705,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstanceGroupManagerResizeRequestsRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstanceGroupManagerResizeRequestRequest.pb( compute.InsertInstanceGroupManagerResizeRequestRequest() ) @@ -3661,6 +3736,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3672,6 +3748,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -3772,10 +3849,14 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstanceGroupManagerResizeRequestsRestInterceptor, + "post_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagerResizeRequestsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstanceGroupManagerResizeRequestsRequest.pb( compute.ListInstanceGroupManagerResizeRequestsRequest() ) @@ -3801,6 +3882,10 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagerResizeRequestsListResponse() + post_with_metadata.return_value = ( + compute.InstanceGroupManagerResizeRequestsListResponse(), + metadata, + ) client.list( request, @@ -3812,6 +3897,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_instance_group_managers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_managers.py index 1062275be377..487694590718 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_managers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_group_managers.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = InstanceGroupManagersClient(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 = InstanceGroupManagersClient(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", [ @@ -10815,10 +10865,14 @@ def test_abandon_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_abandon_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_abandon_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_abandon_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AbandonInstancesInstanceGroupManagerRequest.pb( compute.AbandonInstancesInstanceGroupManagerRequest() ) @@ -10842,6 +10896,7 @@ def test_abandon_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.abandon_instances( request, @@ -10853,6 +10908,7 @@ def test_abandon_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -10945,10 +11001,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInstanceGroupManagersRequest.pb( compute.AggregatedListInstanceGroupManagersRequest() ) @@ -10974,6 +11034,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagerAggregatedList() + post_with_metadata.return_value = ( + compute.InstanceGroupManagerAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -10985,6 +11049,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_updates_to_instances_rest_bad_request( @@ -11208,11 +11273,15 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): transports.InstanceGroupManagersRestInterceptor, "post_apply_updates_to_instances", ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_apply_updates_to_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_apply_updates_to_instances", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ApplyUpdatesToInstancesInstanceGroupManagerRequest.pb( compute.ApplyUpdatesToInstancesInstanceGroupManagerRequest() ) @@ -11236,6 +11305,7 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.apply_updates_to_instances( request, @@ -11247,6 +11317,7 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_instances_rest_bad_request( @@ -11478,10 +11549,14 @@ def test_create_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_create_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_create_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_create_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CreateInstancesInstanceGroupManagerRequest.pb( compute.CreateInstancesInstanceGroupManagerRequest() ) @@ -11505,6 +11580,7 @@ def test_create_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.create_instances( request, @@ -11516,6 +11592,7 @@ def test_create_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -11650,10 +11727,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstanceGroupManagerRequest.pb( compute.DeleteInstanceGroupManagerRequest() ) @@ -11677,6 +11757,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -11688,6 +11769,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instances_rest_bad_request( @@ -11908,10 +11990,14 @@ def test_delete_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_delete_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_delete_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_delete_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstancesInstanceGroupManagerRequest.pb( compute.DeleteInstancesInstanceGroupManagerRequest() ) @@ -11935,6 +12021,7 @@ def test_delete_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_instances( request, @@ -11946,6 +12033,7 @@ def test_delete_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_per_instance_configs_rest_bad_request( @@ -12168,11 +12256,15 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): transports.InstanceGroupManagersRestInterceptor, "post_delete_per_instance_configs", ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_delete_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_delete_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeletePerInstanceConfigsInstanceGroupManagerRequest.pb( compute.DeletePerInstanceConfigsInstanceGroupManagerRequest() ) @@ -12196,6 +12288,7 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_per_instance_configs( request, @@ -12207,6 +12300,7 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInstanceGroupManagerRequest): @@ -12336,10 +12430,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceGroupManagerRequest.pb( compute.GetInstanceGroupManagerRequest() ) @@ -12365,6 +12462,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManager() + post_with_metadata.return_value = compute.InstanceGroupManager(), metadata client.get( request, @@ -12376,6 +12474,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -12660,10 +12759,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstanceGroupManagerRequest.pb( compute.InsertInstanceGroupManagerRequest() ) @@ -12687,6 +12789,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -12698,6 +12801,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInstanceGroupManagersRequest): @@ -12786,10 +12890,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstanceGroupManagersRequest.pb( compute.ListInstanceGroupManagersRequest() ) @@ -12815,6 +12922,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagerList() + post_with_metadata.return_value = compute.InstanceGroupManagerList(), metadata client.list( request, @@ -12826,6 +12934,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_errors_rest_bad_request( @@ -12918,10 +13027,14 @@ def test_list_errors_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_list_errors" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_list_errors_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_list_errors" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListErrorsInstanceGroupManagersRequest.pb( compute.ListErrorsInstanceGroupManagersRequest() ) @@ -12947,6 +13060,10 @@ def test_list_errors_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagersListErrorsResponse() + post_with_metadata.return_value = ( + compute.InstanceGroupManagersListErrorsResponse(), + metadata, + ) client.list_errors( request, @@ -12958,6 +13075,7 @@ def test_list_errors_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_managed_instances_rest_bad_request( @@ -13052,10 +13170,14 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_list_managed_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_list_managed_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_list_managed_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListManagedInstancesInstanceGroupManagersRequest.pb( compute.ListManagedInstancesInstanceGroupManagersRequest() ) @@ -13083,6 +13205,10 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagersListManagedInstancesResponse() + post_with_metadata.return_value = ( + compute.InstanceGroupManagersListManagedInstancesResponse(), + metadata, + ) client.list_managed_instances( request, @@ -13094,6 +13220,7 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_per_instance_configs_rest_bad_request( @@ -13189,10 +13316,14 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): transports.InstanceGroupManagersRestInterceptor, "post_list_per_instance_configs", ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_list_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_list_per_instance_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPerInstanceConfigsInstanceGroupManagersRequest.pb( compute.ListPerInstanceConfigsInstanceGroupManagersRequest() ) @@ -13218,6 +13349,10 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManagersListPerInstanceConfigsResp() + post_with_metadata.return_value = ( + compute.InstanceGroupManagersListPerInstanceConfigsResp(), + metadata, + ) client.list_per_instance_configs( request, @@ -13229,6 +13364,7 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchInstanceGroupManagerRequest): @@ -13519,10 +13655,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchInstanceGroupManagerRequest.pb( compute.PatchInstanceGroupManagerRequest() ) @@ -13546,6 +13685,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -13557,6 +13697,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_per_instance_configs_rest_bad_request( @@ -13789,11 +13930,15 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): transports.InstanceGroupManagersRestInterceptor, "post_patch_per_instance_configs", ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_patch_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_patch_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchPerInstanceConfigsInstanceGroupManagerRequest.pb( compute.PatchPerInstanceConfigsInstanceGroupManagerRequest() ) @@ -13817,6 +13962,7 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_per_instance_configs( request, @@ -13828,6 +13974,7 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_recreate_instances_rest_bad_request( @@ -14047,10 +14194,14 @@ def test_recreate_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_recreate_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_recreate_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_recreate_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RecreateInstancesInstanceGroupManagerRequest.pb( compute.RecreateInstancesInstanceGroupManagerRequest() ) @@ -14074,6 +14225,7 @@ def test_recreate_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.recreate_instances( request, @@ -14085,6 +14237,7 @@ def test_recreate_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resize_rest_bad_request( @@ -14219,10 +14372,13 @@ def test_resize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_resize" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, "post_resize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_resize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResizeInstanceGroupManagerRequest.pb( compute.ResizeInstanceGroupManagerRequest() ) @@ -14246,6 +14402,7 @@ def test_resize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resize( request, @@ -14257,6 +14414,7 @@ def test_resize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_instances_rest_bad_request( @@ -14476,10 +14634,14 @@ def test_resume_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_resume_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_resume_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_resume_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResumeInstancesInstanceGroupManagerRequest.pb( compute.ResumeInstancesInstanceGroupManagerRequest() ) @@ -14503,6 +14665,7 @@ def test_resume_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resume_instances( request, @@ -14514,6 +14677,7 @@ def test_resume_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_instance_template_rest_bad_request( @@ -14733,10 +14897,14 @@ def test_set_instance_template_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_set_instance_template" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_set_instance_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_set_instance_template" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetInstanceTemplateInstanceGroupManagerRequest.pb( compute.SetInstanceTemplateInstanceGroupManagerRequest() ) @@ -14760,6 +14928,7 @@ def test_set_instance_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_instance_template( request, @@ -14771,6 +14940,7 @@ def test_set_instance_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_target_pools_rest_bad_request( @@ -14991,10 +15161,14 @@ def test_set_target_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_set_target_pools" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_set_target_pools_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_set_target_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetTargetPoolsInstanceGroupManagerRequest.pb( compute.SetTargetPoolsInstanceGroupManagerRequest() ) @@ -15018,6 +15192,7 @@ def test_set_target_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_target_pools( request, @@ -15029,6 +15204,7 @@ def test_set_target_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_instances_rest_bad_request( @@ -15248,10 +15424,14 @@ def test_start_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_start_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_start_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_start_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartInstancesInstanceGroupManagerRequest.pb( compute.StartInstancesInstanceGroupManagerRequest() ) @@ -15275,6 +15455,7 @@ def test_start_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start_instances( request, @@ -15286,6 +15467,7 @@ def test_start_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_instances_rest_bad_request( @@ -15506,10 +15688,14 @@ def test_stop_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_stop_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_stop_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_stop_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopInstancesInstanceGroupManagerRequest.pb( compute.StopInstancesInstanceGroupManagerRequest() ) @@ -15533,6 +15719,7 @@ def test_stop_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_instances( request, @@ -15544,6 +15731,7 @@ def test_stop_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_suspend_instances_rest_bad_request( @@ -15764,10 +15952,14 @@ def test_suspend_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "post_suspend_instances" ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_suspend_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_suspend_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SuspendInstancesInstanceGroupManagerRequest.pb( compute.SuspendInstancesInstanceGroupManagerRequest() ) @@ -15791,6 +15983,7 @@ def test_suspend_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.suspend_instances( request, @@ -15802,6 +15995,7 @@ def test_suspend_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_per_instance_configs_rest_bad_request( @@ -16036,11 +16230,15 @@ def test_update_per_instance_configs_rest_interceptors(null_interceptor): transports.InstanceGroupManagersRestInterceptor, "post_update_per_instance_configs", ) as post, mock.patch.object( + transports.InstanceGroupManagersRestInterceptor, + "post_update_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupManagersRestInterceptor, "pre_update_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdatePerInstanceConfigsInstanceGroupManagerRequest.pb( compute.UpdatePerInstanceConfigsInstanceGroupManagerRequest() ) @@ -16064,6 +16262,7 @@ def test_update_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_per_instance_configs( request, @@ -16075,6 +16274,7 @@ def test_update_per_instance_configs_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-compute/tests/unit/gapic/compute_v1/test_instance_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py index a6e30fd275a0..1ce1ee1381f0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = InstanceGroupsClient(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 = InstanceGroupsClient(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", [ @@ -4382,10 +4432,13 @@ def test_add_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_add_instances" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_add_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_add_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddInstancesInstanceGroupRequest.pb( compute.AddInstancesInstanceGroupRequest() ) @@ -4409,6 +4462,7 @@ def test_add_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_instances( request, @@ -4420,6 +4474,7 @@ def test_add_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -4512,10 +4567,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInstanceGroupsRequest.pb( compute.AggregatedListInstanceGroupsRequest() ) @@ -4541,6 +4599,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupAggregatedList() + post_with_metadata.return_value = ( + compute.InstanceGroupAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -4552,6 +4614,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteInstanceGroupRequest): @@ -4684,10 +4747,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstanceGroupRequest.pb( compute.DeleteInstanceGroupRequest() ) @@ -4711,6 +4777,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4722,6 +4789,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInstanceGroupRequest): @@ -4834,10 +4902,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceGroupRequest.pb( compute.GetInstanceGroupRequest() ) @@ -4861,6 +4932,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroup() + post_with_metadata.return_value = compute.InstanceGroup(), metadata client.get( request, @@ -4872,6 +4944,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertInstanceGroupRequest): @@ -5082,10 +5155,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstanceGroupRequest.pb( compute.InsertInstanceGroupRequest() ) @@ -5109,6 +5185,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5120,6 +5197,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInstanceGroupsRequest): @@ -5208,10 +5286,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstanceGroupsRequest.pb( compute.ListInstanceGroupsRequest() ) @@ -5235,6 +5316,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupList() + post_with_metadata.return_value = compute.InstanceGroupList(), metadata client.list( request, @@ -5246,6 +5328,7 @@ def test_list_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( @@ -5429,10 +5512,13 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_list_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstancesInstanceGroupsRequest.pb( compute.ListInstancesInstanceGroupsRequest() ) @@ -5458,6 +5544,10 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupsListInstances() + post_with_metadata.return_value = ( + compute.InstanceGroupsListInstances(), + metadata, + ) client.list_instances( request, @@ -5469,6 +5559,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_remove_instances_rest_bad_request( @@ -5688,10 +5779,13 @@ def test_remove_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_remove_instances" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_remove_instances_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_remove_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveInstancesInstanceGroupRequest.pb( compute.RemoveInstancesInstanceGroupRequest() ) @@ -5715,6 +5809,7 @@ def test_remove_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_instances( request, @@ -5726,6 +5821,7 @@ def test_remove_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_named_ports_rest_bad_request( @@ -5946,10 +6042,13 @@ def test_set_named_ports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceGroupsRestInterceptor, "post_set_named_ports" ) as post, mock.patch.object( + transports.InstanceGroupsRestInterceptor, "post_set_named_ports_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceGroupsRestInterceptor, "pre_set_named_ports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetNamedPortsInstanceGroupRequest.pb( compute.SetNamedPortsInstanceGroupRequest() ) @@ -5973,6 +6072,7 @@ def test_set_named_ports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_named_ports( request, @@ -5984,6 +6084,7 @@ def test_set_named_ports_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-compute/tests/unit/gapic/compute_v1/test_instance_settings_service.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_settings_service.py index 70a016423df3..3d1659cae28c 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_settings_service.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_settings_service.py @@ -65,6 +65,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -335,6 +342,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = InstanceSettingsServiceClient(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 = InstanceSettingsServiceClient(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", [ @@ -1733,10 +1783,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceSettingsServiceRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstanceSettingsServiceRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceSettingsServiceRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceSettingRequest.pb( compute.GetInstanceSettingRequest() ) @@ -1760,6 +1813,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceSettings() + post_with_metadata.return_value = compute.InstanceSettings(), metadata client.get( request, @@ -1771,6 +1825,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchInstanceSettingRequest): @@ -1974,10 +2029,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceSettingsServiceRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.InstanceSettingsServiceRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceSettingsServiceRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchInstanceSettingRequest.pb( compute.PatchInstanceSettingRequest() ) @@ -2001,6 +2059,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -2012,6 +2071,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_instance_templates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py index 852af628bbae..9bb4e1faaa6b 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instance_templates.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = InstanceTemplatesClient(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 = InstanceTemplatesClient(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", [ @@ -3218,10 +3268,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInstanceTemplatesRequest.pb( compute.AggregatedListInstanceTemplatesRequest() ) @@ -3247,6 +3301,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceTemplateAggregatedList() + post_with_metadata.return_value = ( + compute.InstanceTemplateAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3258,6 +3316,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteInstanceTemplateRequest): @@ -3382,10 +3441,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstanceTemplateRequest.pb( compute.DeleteInstanceTemplateRequest() ) @@ -3409,6 +3471,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3420,6 +3483,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInstanceTemplateRequest): @@ -3516,10 +3580,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceTemplateRequest.pb( compute.GetInstanceTemplateRequest() ) @@ -3543,6 +3610,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceTemplate() + post_with_metadata.return_value = compute.InstanceTemplate(), metadata client.get( request, @@ -3554,6 +3622,7 @@ def test_get_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( @@ -3642,10 +3711,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyInstanceTemplateRequest.pb( compute.GetIamPolicyInstanceTemplateRequest() ) @@ -3669,6 +3741,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3680,6 +3753,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_insert_rest_bad_request(request_type=compute.InsertInstanceTemplateRequest): @@ -3871,6 +3945,7 @@ def test_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -4074,10 +4149,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstanceTemplateRequest.pb( compute.InsertInstanceTemplateRequest() ) @@ -4101,6 +4179,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4112,6 +4191,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInstanceTemplatesRequest): @@ -4200,10 +4280,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstanceTemplatesRequest.pb( compute.ListInstanceTemplatesRequest() ) @@ -4229,6 +4312,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceTemplateList() + post_with_metadata.return_value = compute.InstanceTemplateList(), metadata client.list( request, @@ -4240,6 +4324,7 @@ def test_list_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( @@ -4444,10 +4529,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyInstanceTemplateRequest.pb( compute.SetIamPolicyInstanceTemplateRequest() ) @@ -4471,6 +4559,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4482,6 +4571,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( @@ -4644,10 +4734,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.InstanceTemplatesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstanceTemplatesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsInstanceTemplateRequest.pb( compute.TestIamPermissionsInstanceTemplateRequest() ) @@ -4673,6 +4767,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4684,6 +4779,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py index 6f428a2c81bd..0f766e1861e6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instances.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -294,6 +301,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = InstancesClient(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 = InstancesClient(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", [ @@ -19741,10 +19791,13 @@ def test_add_access_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_add_access_config" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_add_access_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_add_access_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddAccessConfigInstanceRequest.pb( compute.AddAccessConfigInstanceRequest() ) @@ -19768,6 +19821,7 @@ def test_add_access_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_access_config( request, @@ -19779,6 +19833,7 @@ def test_add_access_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_resource_policies_rest_bad_request( @@ -19988,10 +20043,13 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_add_resource_policies" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_add_resource_policies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_add_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddResourcePoliciesInstanceRequest.pb( compute.AddResourcePoliciesInstanceRequest() ) @@ -20015,6 +20073,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_resource_policies( request, @@ -20026,6 +20085,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -20116,10 +20176,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInstancesRequest.pb( compute.AggregatedListInstancesRequest() ) @@ -20145,6 +20208,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceAggregatedList() + post_with_metadata.return_value = compute.InstanceAggregatedList(), metadata client.aggregated_list( request, @@ -20156,6 +20220,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_attach_disk_rest_bad_request(request_type=compute.AttachDiskInstanceRequest): @@ -20401,10 +20466,13 @@ def test_attach_disk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_attach_disk" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_attach_disk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_attach_disk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AttachDiskInstanceRequest.pb( compute.AttachDiskInstanceRequest() ) @@ -20428,6 +20496,7 @@ def test_attach_disk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.attach_disk( request, @@ -20439,6 +20508,7 @@ def test_attach_disk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_insert_rest_bad_request(request_type=compute.BulkInsertInstanceRequest): @@ -20626,6 +20696,7 @@ def test_bulk_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -20824,10 +20895,13 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_bulk_insert" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_bulk_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_bulk_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.BulkInsertInstanceRequest.pb( compute.BulkInsertInstanceRequest() ) @@ -20851,6 +20925,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.bulk_insert( request, @@ -20862,6 +20937,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteInstanceRequest): @@ -20984,10 +21060,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstanceRequest.pb(compute.DeleteInstanceRequest()) transcode.return_value = { "method": "post", @@ -21009,6 +21088,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -21020,6 +21100,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_access_config_rest_bad_request( @@ -21144,10 +21225,13 @@ def test_delete_access_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_delete_access_config" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_delete_access_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_delete_access_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteAccessConfigInstanceRequest.pb( compute.DeleteAccessConfigInstanceRequest() ) @@ -21171,6 +21255,7 @@ def test_delete_access_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_access_config( request, @@ -21182,6 +21267,7 @@ def test_delete_access_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_detach_disk_rest_bad_request(request_type=compute.DetachDiskInstanceRequest): @@ -21304,10 +21390,13 @@ def test_detach_disk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_detach_disk" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_detach_disk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_detach_disk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DetachDiskInstanceRequest.pb( compute.DetachDiskInstanceRequest() ) @@ -21331,6 +21420,7 @@ def test_detach_disk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.detach_disk( request, @@ -21342,6 +21432,7 @@ def test_detach_disk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInstanceRequest): @@ -21474,10 +21565,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstanceRequest.pb(compute.GetInstanceRequest()) transcode.return_value = { "method": "post", @@ -21499,6 +21593,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Instance() + post_with_metadata.return_value = compute.Instance(), metadata client.get( request, @@ -21510,6 +21605,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_firewalls_rest_bad_request( @@ -21589,10 +21685,14 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_effective_firewalls" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_get_effective_firewalls_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_effective_firewalls" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetEffectiveFirewallsInstanceRequest.pb( compute.GetEffectiveFirewallsInstanceRequest() ) @@ -21618,6 +21718,10 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstancesGetEffectiveFirewallsResponse() + post_with_metadata.return_value = ( + compute.InstancesGetEffectiveFirewallsResponse(), + metadata, + ) client.get_effective_firewalls( request, @@ -21629,6 +21733,7 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_guest_attributes_rest_bad_request( @@ -21719,10 +21824,13 @@ def test_get_guest_attributes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_guest_attributes" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_guest_attributes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_guest_attributes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetGuestAttributesInstanceRequest.pb( compute.GetGuestAttributesInstanceRequest() ) @@ -21746,6 +21854,7 @@ def test_get_guest_attributes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.GuestAttributes() + post_with_metadata.return_value = compute.GuestAttributes(), metadata client.get_guest_attributes( request, @@ -21757,6 +21866,7 @@ def test_get_guest_attributes_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( @@ -21843,10 +21953,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyInstanceRequest.pb( compute.GetIamPolicyInstanceRequest() ) @@ -21870,6 +21983,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -21881,6 +21995,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_get_screenshot_rest_bad_request( @@ -21965,10 +22080,13 @@ def test_get_screenshot_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_screenshot" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_screenshot_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_screenshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetScreenshotInstanceRequest.pb( compute.GetScreenshotInstanceRequest() ) @@ -21992,6 +22110,7 @@ def test_get_screenshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Screenshot() + post_with_metadata.return_value = compute.Screenshot(), metadata client.get_screenshot( request, @@ -22003,6 +22122,7 @@ def test_get_screenshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_serial_port_output_rest_bad_request( @@ -22093,10 +22213,13 @@ def test_get_serial_port_output_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_serial_port_output" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_get_serial_port_output_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_serial_port_output" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSerialPortOutputInstanceRequest.pb( compute.GetSerialPortOutputInstanceRequest() ) @@ -22120,6 +22243,7 @@ def test_get_serial_port_output_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SerialPortOutput() + post_with_metadata.return_value = compute.SerialPortOutput(), metadata client.get_serial_port_output( request, @@ -22131,6 +22255,7 @@ def test_get_serial_port_output_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_shielded_instance_identity_rest_bad_request( @@ -22213,10 +22338,14 @@ def test_get_shielded_instance_identity_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_get_shielded_instance_identity" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_get_shielded_instance_identity_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_get_shielded_instance_identity" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetShieldedInstanceIdentityInstanceRequest.pb( compute.GetShieldedInstanceIdentityInstanceRequest() ) @@ -22242,6 +22371,7 @@ def test_get_shielded_instance_identity_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ShieldedInstanceIdentity() + post_with_metadata.return_value = compute.ShieldedInstanceIdentity(), metadata client.get_shielded_instance_identity( request, @@ -22253,6 +22383,7 @@ def test_get_shielded_instance_identity_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertInstanceRequest): @@ -22457,6 +22588,7 @@ def test_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -22646,10 +22778,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstanceRequest.pb(compute.InsertInstanceRequest()) transcode.return_value = { "method": "post", @@ -22671,6 +22806,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -22682,6 +22818,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInstancesRequest): @@ -22768,10 +22905,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstancesRequest.pb(compute.ListInstancesRequest()) transcode.return_value = { "method": "post", @@ -22793,6 +22933,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceList() + post_with_metadata.return_value = compute.InstanceList(), metadata client.list( request, @@ -22804,6 +22945,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_referrers_rest_bad_request( @@ -22892,10 +23034,13 @@ def test_list_referrers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_list_referrers" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_list_referrers_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_list_referrers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListReferrersInstancesRequest.pb( compute.ListReferrersInstancesRequest() ) @@ -22921,6 +23066,7 @@ def test_list_referrers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceListReferrers() + post_with_metadata.return_value = compute.InstanceListReferrers(), metadata client.list_referrers( request, @@ -22932,6 +23078,7 @@ def test_list_referrers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_perform_maintenance_rest_bad_request( @@ -23056,10 +23203,13 @@ def test_perform_maintenance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_perform_maintenance" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_perform_maintenance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_perform_maintenance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PerformMaintenanceInstanceRequest.pb( compute.PerformMaintenanceInstanceRequest() ) @@ -23083,6 +23233,7 @@ def test_perform_maintenance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.perform_maintenance( request, @@ -23094,6 +23245,7 @@ def test_perform_maintenance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_resource_policies_rest_bad_request( @@ -23303,10 +23455,14 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_remove_resource_policies" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_remove_resource_policies_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_remove_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveResourcePoliciesInstanceRequest.pb( compute.RemoveResourcePoliciesInstanceRequest() ) @@ -23330,6 +23486,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_resource_policies( request, @@ -23341,6 +23498,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reset_rest_bad_request(request_type=compute.ResetInstanceRequest): @@ -23463,10 +23621,13 @@ def test_reset_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_reset" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_reset_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_reset" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResetInstanceRequest.pb(compute.ResetInstanceRequest()) transcode.return_value = { "method": "post", @@ -23488,6 +23649,7 @@ def test_reset_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.reset( request, @@ -23499,6 +23661,7 @@ def test_reset_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_rest_bad_request(request_type=compute.ResumeInstanceRequest): @@ -23621,10 +23784,13 @@ def test_resume_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_resume" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_resume_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_resume" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResumeInstanceRequest.pb(compute.ResumeInstanceRequest()) transcode.return_value = { "method": "post", @@ -23646,6 +23812,7 @@ def test_resume_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resume( request, @@ -23657,6 +23824,7 @@ def test_resume_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_send_diagnostic_interrupt_rest_bad_request( @@ -23736,10 +23904,14 @@ def test_send_diagnostic_interrupt_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_send_diagnostic_interrupt" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_send_diagnostic_interrupt_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_send_diagnostic_interrupt" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SendDiagnosticInterruptInstanceRequest.pb( compute.SendDiagnosticInterruptInstanceRequest() ) @@ -23765,6 +23937,10 @@ def test_send_diagnostic_interrupt_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SendDiagnosticInterruptInstanceResponse() + post_with_metadata.return_value = ( + compute.SendDiagnosticInterruptInstanceResponse(), + metadata, + ) client.send_diagnostic_interrupt( request, @@ -23776,6 +23952,7 @@ def test_send_diagnostic_interrupt_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_deletion_protection_rest_bad_request( @@ -23900,10 +24077,14 @@ def test_set_deletion_protection_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_deletion_protection" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_set_deletion_protection_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_deletion_protection" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetDeletionProtectionInstanceRequest.pb( compute.SetDeletionProtectionInstanceRequest() ) @@ -23927,6 +24108,7 @@ def test_set_deletion_protection_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_deletion_protection( request, @@ -23938,6 +24120,7 @@ def test_set_deletion_protection_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_disk_auto_delete_rest_bad_request( @@ -24062,10 +24245,13 @@ def test_set_disk_auto_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_disk_auto_delete" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_disk_auto_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_disk_auto_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetDiskAutoDeleteInstanceRequest.pb( compute.SetDiskAutoDeleteInstanceRequest() ) @@ -24089,6 +24275,7 @@ def test_set_disk_auto_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_disk_auto_delete( request, @@ -24100,6 +24287,7 @@ def test_set_disk_auto_delete_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( @@ -24302,10 +24490,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyInstanceRequest.pb( compute.SetIamPolicyInstanceRequest() ) @@ -24329,6 +24520,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -24340,6 +24532,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_set_labels_rest_bad_request(request_type=compute.SetLabelsInstanceRequest): @@ -24543,10 +24736,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsInstanceRequest.pb( compute.SetLabelsInstanceRequest() ) @@ -24570,6 +24766,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -24581,6 +24778,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_machine_resources_rest_bad_request( @@ -24792,10 +24990,13 @@ def test_set_machine_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_machine_resources" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_machine_resources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_machine_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetMachineResourcesInstanceRequest.pb( compute.SetMachineResourcesInstanceRequest() ) @@ -24819,6 +25020,7 @@ def test_set_machine_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_machine_resources( request, @@ -24830,6 +25032,7 @@ def test_set_machine_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_machine_type_rest_bad_request( @@ -25039,10 +25242,13 @@ def test_set_machine_type_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_machine_type" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_machine_type_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_machine_type" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetMachineTypeInstanceRequest.pb( compute.SetMachineTypeInstanceRequest() ) @@ -25066,6 +25272,7 @@ def test_set_machine_type_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_machine_type( request, @@ -25077,6 +25284,7 @@ def test_set_machine_type_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_metadata_rest_bad_request(request_type=compute.SetMetadataInstanceRequest): @@ -25271,10 +25479,13 @@ def test_set_metadata_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_metadata" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_metadata_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_metadata" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetMetadataInstanceRequest.pb( compute.SetMetadataInstanceRequest() ) @@ -25298,6 +25509,7 @@ def test_set_metadata_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_metadata( request, @@ -25309,6 +25521,7 @@ def test_set_metadata_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_min_cpu_platform_rest_bad_request( @@ -25518,10 +25731,13 @@ def test_set_min_cpu_platform_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_min_cpu_platform" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_min_cpu_platform_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_min_cpu_platform" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetMinCpuPlatformInstanceRequest.pb( compute.SetMinCpuPlatformInstanceRequest() ) @@ -25545,6 +25761,7 @@ def test_set_min_cpu_platform_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_min_cpu_platform( request, @@ -25556,6 +25773,7 @@ def test_set_min_cpu_platform_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_name_rest_bad_request(request_type=compute.SetNameInstanceRequest): @@ -25757,10 +25975,13 @@ def test_set_name_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_name" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_name_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_name" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetNameInstanceRequest.pb(compute.SetNameInstanceRequest()) transcode.return_value = { "method": "post", @@ -25782,6 +26003,7 @@ def test_set_name_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_name( request, @@ -25793,6 +26015,7 @@ def test_set_name_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_scheduling_rest_bad_request( @@ -25837,6 +26060,7 @@ def test_set_scheduling_rest_call_success(request_type): request_init["scheduling_resource"] = { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -26005,10 +26229,13 @@ def test_set_scheduling_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_scheduling" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_scheduling_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_scheduling" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSchedulingInstanceRequest.pb( compute.SetSchedulingInstanceRequest() ) @@ -26032,6 +26259,7 @@ def test_set_scheduling_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_scheduling( request, @@ -26043,6 +26271,7 @@ def test_set_scheduling_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_security_policy_rest_bad_request( @@ -26256,10 +26485,13 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_security_policy" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_security_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSecurityPolicyInstanceRequest.pb( compute.SetSecurityPolicyInstanceRequest() ) @@ -26283,6 +26515,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_security_policy( request, @@ -26294,6 +26527,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_service_account_rest_bad_request( @@ -26504,10 +26738,13 @@ def test_set_service_account_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_service_account" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_service_account_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_service_account" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetServiceAccountInstanceRequest.pb( compute.SetServiceAccountInstanceRequest() ) @@ -26531,6 +26768,7 @@ def test_set_service_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_service_account( request, @@ -26542,6 +26780,7 @@ def test_set_service_account_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_shielded_instance_integrity_policy_rest_bad_request( @@ -26752,11 +26991,15 @@ def test_set_shielded_instance_integrity_policy_rest_interceptors(null_intercept transports.InstancesRestInterceptor, "post_set_shielded_instance_integrity_policy", ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_set_shielded_instance_integrity_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_shielded_instance_integrity_policy", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetShieldedInstanceIntegrityPolicyInstanceRequest.pb( compute.SetShieldedInstanceIntegrityPolicyInstanceRequest() ) @@ -26780,6 +27023,7 @@ def test_set_shielded_instance_integrity_policy_rest_interceptors(null_intercept ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_shielded_instance_integrity_policy( request, @@ -26791,6 +27035,7 @@ def test_set_shielded_instance_integrity_policy_rest_interceptors(null_intercept pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_tags_rest_bad_request(request_type=compute.SetTagsInstanceRequest): @@ -26984,10 +27229,13 @@ def test_set_tags_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_set_tags" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_set_tags_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_set_tags" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetTagsInstanceRequest.pb(compute.SetTagsInstanceRequest()) transcode.return_value = { "method": "post", @@ -27009,6 +27257,7 @@ def test_set_tags_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_tags( request, @@ -27020,6 +27269,7 @@ def test_set_tags_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_simulate_maintenance_event_rest_bad_request( @@ -27144,10 +27394,14 @@ def test_simulate_maintenance_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_simulate_maintenance_event" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_simulate_maintenance_event_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_simulate_maintenance_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SimulateMaintenanceEventInstanceRequest.pb( compute.SimulateMaintenanceEventInstanceRequest() ) @@ -27171,6 +27425,7 @@ def test_simulate_maintenance_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.simulate_maintenance_event( request, @@ -27182,6 +27437,7 @@ def test_simulate_maintenance_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_rest_bad_request(request_type=compute.StartInstanceRequest): @@ -27304,10 +27560,13 @@ def test_start_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_start" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_start_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_start" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartInstanceRequest.pb(compute.StartInstanceRequest()) transcode.return_value = { "method": "post", @@ -27329,6 +27588,7 @@ def test_start_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start( request, @@ -27340,6 +27600,7 @@ def test_start_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_with_encryption_key_rest_bad_request( @@ -27560,10 +27821,14 @@ def test_start_with_encryption_key_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_start_with_encryption_key" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_start_with_encryption_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_start_with_encryption_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartWithEncryptionKeyInstanceRequest.pb( compute.StartWithEncryptionKeyInstanceRequest() ) @@ -27587,6 +27852,7 @@ def test_start_with_encryption_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start_with_encryption_key( request, @@ -27598,6 +27864,7 @@ def test_start_with_encryption_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_rest_bad_request(request_type=compute.StopInstanceRequest): @@ -27720,10 +27987,13 @@ def test_stop_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_stop" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_stop_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_stop" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopInstanceRequest.pb(compute.StopInstanceRequest()) transcode.return_value = { "method": "post", @@ -27745,6 +28015,7 @@ def test_stop_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop( request, @@ -27756,6 +28027,7 @@ def test_stop_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_suspend_rest_bad_request(request_type=compute.SuspendInstanceRequest): @@ -27878,10 +28150,13 @@ def test_suspend_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_suspend" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_suspend_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_suspend" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SuspendInstanceRequest.pb(compute.SuspendInstanceRequest()) transcode.return_value = { "method": "post", @@ -27903,6 +28178,7 @@ def test_suspend_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.suspend( request, @@ -27914,6 +28190,7 @@ def test_suspend_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( @@ -28074,10 +28351,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsInstanceRequest.pb( compute.TestIamPermissionsInstanceRequest() ) @@ -28103,6 +28383,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -28114,6 +28395,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_update_rest_bad_request(request_type=compute.UpdateInstanceRequest): @@ -28318,6 +28600,7 @@ def test_update_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -28507,10 +28790,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateInstanceRequest.pb(compute.UpdateInstanceRequest()) transcode.return_value = { "method": "post", @@ -28532,6 +28818,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -28543,6 +28830,7 @@ def test_update_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_access_config_rest_bad_request( @@ -28750,10 +29038,13 @@ def test_update_access_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_update_access_config" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_update_access_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_update_access_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateAccessConfigInstanceRequest.pb( compute.UpdateAccessConfigInstanceRequest() ) @@ -28777,6 +29068,7 @@ def test_update_access_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_access_config( request, @@ -28788,6 +29080,7 @@ def test_update_access_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_display_device_rest_bad_request( @@ -28984,10 +29277,13 @@ def test_update_display_device_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_update_display_device" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, "post_update_display_device_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_update_display_device" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateDisplayDeviceInstanceRequest.pb( compute.UpdateDisplayDeviceInstanceRequest() ) @@ -29011,6 +29307,7 @@ def test_update_display_device_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_display_device( request, @@ -29022,6 +29319,7 @@ def test_update_display_device_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_network_interface_rest_bad_request( @@ -29255,10 +29553,14 @@ def test_update_network_interface_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_update_network_interface" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_update_network_interface_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_update_network_interface" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateNetworkInterfaceInstanceRequest.pb( compute.UpdateNetworkInterfaceInstanceRequest() ) @@ -29282,6 +29584,7 @@ def test_update_network_interface_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_network_interface( request, @@ -29293,6 +29596,7 @@ def test_update_network_interface_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_shielded_instance_config_rest_bad_request( @@ -29497,10 +29801,14 @@ def test_update_shielded_instance_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstancesRestInterceptor, "post_update_shielded_instance_config" ) as post, mock.patch.object( + transports.InstancesRestInterceptor, + "post_update_shielded_instance_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstancesRestInterceptor, "pre_update_shielded_instance_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateShieldedInstanceConfigInstanceRequest.pb( compute.UpdateShieldedInstanceConfigInstanceRequest() ) @@ -29524,6 +29832,7 @@ def test_update_shielded_instance_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_shielded_instance_config( request, @@ -29535,6 +29844,7 @@ def test_update_shielded_instance_config_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-compute/tests/unit/gapic/compute_v1/test_instant_snapshots.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instant_snapshots.py index 67d5ca93669d..6470546cac4e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instant_snapshots.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_instant_snapshots.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = InstantSnapshotsClient(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 = InstantSnapshotsClient(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", [ @@ -3733,10 +3783,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInstantSnapshotsRequest.pb( compute.AggregatedListInstantSnapshotsRequest() ) @@ -3762,6 +3815,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstantSnapshotAggregatedList() + post_with_metadata.return_value = ( + compute.InstantSnapshotAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3773,6 +3830,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteInstantSnapshotRequest): @@ -3905,10 +3963,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstantSnapshotRequest.pb( compute.DeleteInstantSnapshotRequest() ) @@ -3932,6 +3993,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3943,6 +4005,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInstantSnapshotRequest): @@ -4065,10 +4128,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInstantSnapshotRequest.pb( compute.GetInstantSnapshotRequest() ) @@ -4092,6 +4158,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstantSnapshot() + post_with_metadata.return_value = compute.InstantSnapshot(), metadata client.get( request, @@ -4103,6 +4170,7 @@ def test_get_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( @@ -4191,10 +4259,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyInstantSnapshotRequest.pb( compute.GetIamPolicyInstantSnapshotRequest() ) @@ -4218,6 +4289,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4229,6 +4301,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_insert_rest_bad_request(request_type=compute.InsertInstantSnapshotRequest): @@ -4447,10 +4520,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInstantSnapshotRequest.pb( compute.InsertInstantSnapshotRequest() ) @@ -4474,6 +4550,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4485,6 +4562,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInstantSnapshotsRequest): @@ -4573,10 +4651,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstantSnapshotsRequest.pb( compute.ListInstantSnapshotsRequest() ) @@ -4602,6 +4683,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstantSnapshotList() + post_with_metadata.return_value = compute.InstantSnapshotList(), metadata client.list( request, @@ -4613,6 +4695,7 @@ def test_list_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( @@ -4817,10 +4900,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyInstantSnapshotRequest.pb( compute.SetIamPolicyInstantSnapshotRequest() ) @@ -4844,6 +4930,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4855,6 +4942,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_set_labels_rest_bad_request( @@ -5060,10 +5148,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsInstantSnapshotRequest.pb( compute.SetLabelsInstantSnapshotRequest() ) @@ -5087,6 +5178,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -5098,6 +5190,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_test_iam_permissions_rest_bad_request( @@ -5260,10 +5353,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.InstantSnapshotsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InstantSnapshotsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsInstantSnapshotRequest.pb( compute.TestIamPermissionsInstantSnapshotRequest() ) @@ -5289,6 +5386,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5300,6 +5398,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_attachments.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_attachments.py index 3ea3f85fad5c..350a42d0808f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_attachments.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_attachments.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = InterconnectAttachmentsClient(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 = InterconnectAttachmentsClient(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", [ @@ -3602,10 +3652,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListInterconnectAttachmentsRequest.pb( compute.AggregatedListInterconnectAttachmentsRequest() ) @@ -3631,6 +3685,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectAttachmentAggregatedList() + post_with_metadata.return_value = ( + compute.InterconnectAttachmentAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3642,6 +3700,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3776,10 +3835,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInterconnectAttachmentRequest.pb( compute.DeleteInterconnectAttachmentRequest() ) @@ -3803,6 +3865,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3814,6 +3877,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInterconnectAttachmentRequest): @@ -3980,10 +4044,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInterconnectAttachmentRequest.pb( compute.GetInterconnectAttachmentRequest() ) @@ -4009,6 +4076,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectAttachment() + post_with_metadata.return_value = compute.InterconnectAttachment(), metadata client.get( request, @@ -4020,6 +4088,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4276,10 +4345,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInterconnectAttachmentRequest.pb( compute.InsertInterconnectAttachmentRequest() ) @@ -4303,6 +4375,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4314,6 +4387,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInterconnectAttachmentsRequest): @@ -4402,10 +4476,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInterconnectAttachmentsRequest.pb( compute.ListInterconnectAttachmentsRequest() ) @@ -4431,6 +4508,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectAttachmentList() + post_with_metadata.return_value = compute.InterconnectAttachmentList(), metadata client.list( request, @@ -4442,6 +4520,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -4706,10 +4785,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchInterconnectAttachmentRequest.pb( compute.PatchInterconnectAttachmentRequest() ) @@ -4733,6 +4815,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4744,6 +4827,7 @@ def test_patch_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( @@ -4949,10 +5033,14 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.InterconnectAttachmentsRestInterceptor, + "post_set_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.InterconnectAttachmentsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsInterconnectAttachmentRequest.pb( compute.SetLabelsInterconnectAttachmentRequest() ) @@ -4976,6 +5064,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4987,6 +5076,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_locations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_locations.py index 4bf17a1cc2d0..c9bda82b4ab7 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_locations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_locations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 = InterconnectLocationsClient(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 = InterconnectLocationsClient(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", [ @@ -1585,10 +1635,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectLocationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InterconnectLocationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectLocationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInterconnectLocationRequest.pb( compute.GetInterconnectLocationRequest() ) @@ -1614,6 +1667,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectLocation() + post_with_metadata.return_value = compute.InterconnectLocation(), metadata client.get( request, @@ -1625,6 +1679,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInterconnectLocationsRequest): @@ -1713,10 +1768,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectLocationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InterconnectLocationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectLocationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInterconnectLocationsRequest.pb( compute.ListInterconnectLocationsRequest() ) @@ -1742,6 +1800,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectLocationList() + post_with_metadata.return_value = compute.InterconnectLocationList(), metadata client.list( request, @@ -1753,6 +1812,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_interconnect_remote_locations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_remote_locations.py index 02065dfc9b7c..04ae391b8a09 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_remote_locations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnect_remote_locations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 = InterconnectRemoteLocationsClient(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 = InterconnectRemoteLocationsClient(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", [ @@ -1615,10 +1665,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectRemoteLocationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InterconnectRemoteLocationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectRemoteLocationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInterconnectRemoteLocationRequest.pb( compute.GetInterconnectRemoteLocationRequest() ) @@ -1644,6 +1697,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectRemoteLocation() + post_with_metadata.return_value = compute.InterconnectRemoteLocation(), metadata client.get( request, @@ -1655,6 +1709,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -1745,10 +1800,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectRemoteLocationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InterconnectRemoteLocationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectRemoteLocationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInterconnectRemoteLocationsRequest.pb( compute.ListInterconnectRemoteLocationsRequest() ) @@ -1774,6 +1832,10 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectRemoteLocationList() + post_with_metadata.return_value = ( + compute.InterconnectRemoteLocationList(), + metadata, + ) client.list( request, @@ -1785,6 +1847,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_interconnects.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnects.py index c69a038c4195..e8e5b82d7598 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnects.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_interconnects.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -315,6 +322,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 = InterconnectsClient(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 = InterconnectsClient(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", [ @@ -3528,10 +3578,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInterconnectRequest.pb( compute.DeleteInterconnectRequest() ) @@ -3555,6 +3608,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3566,6 +3620,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetInterconnectRequest): @@ -3698,10 +3753,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetInterconnectRequest.pb(compute.GetInterconnectRequest()) transcode.return_value = { "method": "post", @@ -3723,6 +3781,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Interconnect() + post_with_metadata.return_value = compute.Interconnect(), metadata client.get( request, @@ -3734,6 +3793,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_diagnostics_rest_bad_request( @@ -3815,10 +3875,13 @@ def test_get_diagnostics_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_get_diagnostics" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_get_diagnostics_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_get_diagnostics" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetDiagnosticsInterconnectRequest.pb( compute.GetDiagnosticsInterconnectRequest() ) @@ -3844,6 +3907,10 @@ def test_get_diagnostics_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectsGetDiagnosticsResponse() + post_with_metadata.return_value = ( + compute.InterconnectsGetDiagnosticsResponse(), + metadata, + ) client.get_diagnostics( request, @@ -3855,6 +3922,7 @@ def test_get_diagnostics_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_macsec_config_rest_bad_request( @@ -3939,10 +4007,13 @@ def test_get_macsec_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_get_macsec_config" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_get_macsec_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_get_macsec_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetMacsecConfigInterconnectRequest.pb( compute.GetMacsecConfigInterconnectRequest() ) @@ -3968,6 +4039,10 @@ def test_get_macsec_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectsGetMacsecConfigResponse() + post_with_metadata.return_value = ( + compute.InterconnectsGetMacsecConfigResponse(), + metadata, + ) client.get_macsec_config( request, @@ -3979,6 +4054,7 @@ def test_get_macsec_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertInterconnectRequest): @@ -4238,10 +4314,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertInterconnectRequest.pb( compute.InsertInterconnectRequest() ) @@ -4265,6 +4344,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4276,6 +4356,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListInterconnectsRequest): @@ -4364,10 +4445,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInterconnectsRequest.pb( compute.ListInterconnectsRequest() ) @@ -4391,6 +4475,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InterconnectList() + post_with_metadata.return_value = compute.InterconnectList(), metadata client.list( request, @@ -4402,6 +4487,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchInterconnectRequest): @@ -4661,10 +4747,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchInterconnectRequest.pb( compute.PatchInterconnectRequest() ) @@ -4688,6 +4777,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4699,6 +4789,7 @@ def test_patch_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=compute.SetLabelsInterconnectRequest): @@ -4902,10 +4993,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.InterconnectsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.InterconnectsRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.InterconnectsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsInterconnectRequest.pb( compute.SetLabelsInterconnectRequest() ) @@ -4929,6 +5023,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4940,6 +5035,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_license_codes.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_license_codes.py index e452c3388bf3..04821055e21f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_license_codes.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_license_codes.py @@ -58,6 +58,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -296,6 +303,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 = LicenseCodesClient(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 = LicenseCodesClient(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", [ @@ -1447,10 +1497,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseCodesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.LicenseCodesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicenseCodesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetLicenseCodeRequest.pb(compute.GetLicenseCodeRequest()) transcode.return_value = { "method": "post", @@ -1472,6 +1525,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.LicenseCode() + post_with_metadata.return_value = compute.LicenseCode(), metadata client.get( request, @@ -1483,6 +1537,7 @@ def test_get_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( @@ -1645,10 +1700,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicenseCodesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.LicenseCodesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.LicenseCodesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsLicenseCodeRequest.pb( compute.TestIamPermissionsLicenseCodeRequest() ) @@ -1674,6 +1733,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -1685,6 +1745,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_licenses.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_licenses.py index 389b933d59cf..a9644830f882 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_licenses.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_licenses.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.licenses import LicensesClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -287,6 +294,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 = LicensesClient(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 = LicensesClient(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", [ @@ -2935,10 +2985,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteLicenseRequest.pb(compute.DeleteLicenseRequest()) transcode.return_value = { "method": "post", @@ -2960,6 +3013,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2971,6 +3025,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetLicenseRequest): @@ -3067,10 +3122,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetLicenseRequest.pb(compute.GetLicenseRequest()) transcode.return_value = { "method": "post", @@ -3092,6 +3150,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.License() + post_with_metadata.return_value = compute.License(), metadata client.get( request, @@ -3103,6 +3162,7 @@ def test_get_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( @@ -3189,10 +3249,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyLicenseRequest.pb( compute.GetIamPolicyLicenseRequest() ) @@ -3216,6 +3279,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3227,6 +3291,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_insert_rest_bad_request(request_type=compute.InsertLicenseRequest): @@ -3428,10 +3493,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertLicenseRequest.pb(compute.InsertLicenseRequest()) transcode.return_value = { "method": "post", @@ -3453,6 +3521,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3464,6 +3533,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListLicensesRequest): @@ -3548,10 +3618,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListLicensesRequest.pb(compute.ListLicensesRequest()) transcode.return_value = { "method": "post", @@ -3575,6 +3648,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.LicensesListResponse() + post_with_metadata.return_value = compute.LicensesListResponse(), metadata client.list( request, @@ -3586,6 +3660,7 @@ def test_list_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( @@ -3788,10 +3863,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyLicenseRequest.pb( compute.SetIamPolicyLicenseRequest() ) @@ -3815,6 +3893,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -3826,6 +3905,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( @@ -3986,10 +4066,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LicensesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.LicensesRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LicensesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsLicenseRequest.pb( compute.TestIamPermissionsLicenseRequest() ) @@ -4015,6 +4098,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4026,6 +4110,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py index 7f6207057db0..f9163e3d7c4f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_images.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -315,6 +322,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 = MachineImagesClient(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 = MachineImagesClient(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", [ @@ -2958,10 +3008,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteMachineImageRequest.pb( compute.DeleteMachineImageRequest() ) @@ -2985,6 +3038,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2996,6 +3050,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetMachineImageRequest): @@ -3102,10 +3157,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetMachineImageRequest.pb(compute.GetMachineImageRequest()) transcode.return_value = { "method": "post", @@ -3127,6 +3185,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.MachineImage() + post_with_metadata.return_value = compute.MachineImage(), metadata client.get( request, @@ -3138,6 +3197,7 @@ def test_get_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( @@ -3226,10 +3286,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyMachineImageRequest.pb( compute.GetIamPolicyMachineImageRequest() ) @@ -3253,6 +3316,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3264,6 +3328,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_insert_rest_bad_request(request_type=compute.InsertMachineImageRequest): @@ -3454,6 +3519,7 @@ def test_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -3697,10 +3763,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertMachineImageRequest.pb( compute.InsertMachineImageRequest() ) @@ -3724,6 +3793,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3735,6 +3805,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListMachineImagesRequest): @@ -3823,10 +3894,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListMachineImagesRequest.pb( compute.ListMachineImagesRequest() ) @@ -3850,6 +3924,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.MachineImageList() + post_with_metadata.return_value = compute.MachineImageList(), metadata client.list( request, @@ -3861,6 +3936,7 @@ def test_list_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( @@ -4065,10 +4141,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyMachineImageRequest.pb( compute.SetIamPolicyMachineImageRequest() ) @@ -4092,6 +4171,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4103,6 +4183,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( @@ -4265,10 +4346,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineImagesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.MachineImagesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.MachineImagesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsMachineImageRequest.pb( compute.TestIamPermissionsMachineImageRequest() ) @@ -4294,6 +4379,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4305,6 +4391,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_types.py index a2b42a4bf3c8..86985a85a4ff 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_machine_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -297,6 +304,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = MachineTypesClient(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 = MachineTypesClient(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", [ @@ -1796,10 +1846,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineTypesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.MachineTypesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineTypesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListMachineTypesRequest.pb( compute.AggregatedListMachineTypesRequest() ) @@ -1825,6 +1878,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.MachineTypeAggregatedList() + post_with_metadata.return_value = compute.MachineTypeAggregatedList(), metadata client.aggregated_list( request, @@ -1836,6 +1890,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetMachineTypeRequest): @@ -1944,10 +1999,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.MachineTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetMachineTypeRequest.pb(compute.GetMachineTypeRequest()) transcode.return_value = { "method": "post", @@ -1969,6 +2027,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.MachineType() + post_with_metadata.return_value = compute.MachineType(), metadata client.get( request, @@ -1980,6 +2039,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListMachineTypesRequest): @@ -2068,10 +2128,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.MachineTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.MachineTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.MachineTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListMachineTypesRequest.pb( compute.ListMachineTypesRequest() ) @@ -2095,6 +2158,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.MachineTypeList() + post_with_metadata.return_value = compute.MachineTypeList(), metadata client.list( request, @@ -2106,6 +2170,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_network_attachments.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_attachments.py index 414ace4b7790..025774c3d881 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_attachments.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_attachments.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -332,6 +339,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 = NetworkAttachmentsClient(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 = NetworkAttachmentsClient(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", [ @@ -3777,10 +3827,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNetworkAttachmentsRequest.pb( compute.AggregatedListNetworkAttachmentsRequest() ) @@ -3806,6 +3860,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkAttachmentAggregatedList() + post_with_metadata.return_value = ( + compute.NetworkAttachmentAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3817,6 +3875,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteNetworkAttachmentRequest): @@ -3949,10 +4008,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNetworkAttachmentRequest.pb( compute.DeleteNetworkAttachmentRequest() ) @@ -3976,6 +4038,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3987,6 +4050,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNetworkAttachmentRequest): @@ -4103,10 +4167,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkAttachmentRequest.pb( compute.GetNetworkAttachmentRequest() ) @@ -4130,6 +4197,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkAttachment() + post_with_metadata.return_value = compute.NetworkAttachment(), metadata client.get( request, @@ -4141,6 +4209,7 @@ def test_get_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( @@ -4229,10 +4298,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyNetworkAttachmentRequest.pb( compute.GetIamPolicyNetworkAttachmentRequest() ) @@ -4256,6 +4329,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4267,6 +4341,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_insert_rest_bad_request(request_type=compute.InsertNetworkAttachmentRequest): @@ -4500,10 +4575,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNetworkAttachmentRequest.pb( compute.InsertNetworkAttachmentRequest() ) @@ -4527,6 +4605,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4538,6 +4617,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNetworkAttachmentsRequest): @@ -4626,10 +4706,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkAttachmentsRequest.pb( compute.ListNetworkAttachmentsRequest() ) @@ -4655,6 +4738,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkAttachmentList() + post_with_metadata.return_value = compute.NetworkAttachmentList(), metadata client.list( request, @@ -4666,6 +4750,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchNetworkAttachmentRequest): @@ -4907,10 +4992,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchNetworkAttachmentRequest.pb( compute.PatchNetworkAttachmentRequest() ) @@ -4934,6 +5022,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4945,6 +5034,7 @@ def test_patch_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( @@ -5149,10 +5239,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyNetworkAttachmentRequest.pb( compute.SetIamPolicyNetworkAttachmentRequest() ) @@ -5176,6 +5270,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5187,6 +5282,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( @@ -5349,10 +5445,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.NetworkAttachmentsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkAttachmentsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsNetworkAttachmentRequest.pb( compute.TestIamPermissionsNetworkAttachmentRequest() ) @@ -5378,6 +5478,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5389,6 +5490,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_edge_security_services.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_edge_security_services.py index 13ad68322b4b..31f805a605ef 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_edge_security_services.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_edge_security_services.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = NetworkEdgeSecurityServicesClient(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 = NetworkEdgeSecurityServicesClient(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", [ @@ -2953,10 +3003,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NetworkEdgeSecurityServicesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNetworkEdgeSecurityServicesRequest.pb( compute.AggregatedListNetworkEdgeSecurityServicesRequest() ) @@ -2982,6 +3036,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEdgeSecurityServiceAggregatedList() + post_with_metadata.return_value = ( + compute.NetworkEdgeSecurityServiceAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -2993,6 +3051,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3127,10 +3186,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NetworkEdgeSecurityServicesRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNetworkEdgeSecurityServiceRequest.pb( compute.DeleteNetworkEdgeSecurityServiceRequest() ) @@ -3154,6 +3217,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3165,6 +3229,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -3275,10 +3340,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworkEdgeSecurityServicesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkEdgeSecurityServiceRequest.pb( compute.GetNetworkEdgeSecurityServiceRequest() ) @@ -3304,6 +3372,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEdgeSecurityService() + post_with_metadata.return_value = compute.NetworkEdgeSecurityService(), metadata client.get( request, @@ -3315,6 +3384,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -3531,10 +3601,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NetworkEdgeSecurityServicesRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNetworkEdgeSecurityServiceRequest.pb( compute.InsertNetworkEdgeSecurityServiceRequest() ) @@ -3558,6 +3632,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3569,6 +3644,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -3793,10 +3869,14 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.NetworkEdgeSecurityServicesRestInterceptor, + "post_patch_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEdgeSecurityServicesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchNetworkEdgeSecurityServiceRequest.pb( compute.PatchNetworkEdgeSecurityServiceRequest() ) @@ -3820,6 +3900,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -3831,6 +3912,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_network_endpoint_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_endpoint_groups.py index ef914d3162e5..8c7c6fbc31c5 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_endpoint_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_endpoint_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = NetworkEndpointGroupsClient(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 = NetworkEndpointGroupsClient(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", [ @@ -4130,10 +4180,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNetworkEndpointGroupsRequest.pb( compute.AggregatedListNetworkEndpointGroupsRequest() ) @@ -4159,6 +4213,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupAggregatedList() + post_with_metadata.return_value = ( + compute.NetworkEndpointGroupAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -4170,6 +4228,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_attach_network_endpoints_rest_bad_request( @@ -4399,10 +4458,14 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_attach_network_endpoints" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, + "post_attach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_attach_network_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AttachNetworkEndpointsNetworkEndpointGroupRequest.pb( compute.AttachNetworkEndpointsNetworkEndpointGroupRequest() ) @@ -4426,6 +4489,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.attach_network_endpoints( request, @@ -4437,6 +4501,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -4571,10 +4636,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNetworkEndpointGroupRequest.pb( compute.DeleteNetworkEndpointGroupRequest() ) @@ -4598,6 +4666,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4609,6 +4678,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_detach_network_endpoints_rest_bad_request( @@ -4838,10 +4908,14 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_detach_network_endpoints" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, + "post_detach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_detach_network_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DetachNetworkEndpointsNetworkEndpointGroupRequest.pb( compute.DetachNetworkEndpointsNetworkEndpointGroupRequest() ) @@ -4865,6 +4939,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.detach_network_endpoints( request, @@ -4876,6 +4951,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNetworkEndpointGroupRequest): @@ -4992,10 +5068,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkEndpointGroupRequest.pb( compute.GetNetworkEndpointGroupRequest() ) @@ -5021,6 +5100,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroup() + post_with_metadata.return_value = compute.NetworkEndpointGroup(), metadata client.get( request, @@ -5032,6 +5112,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -5267,10 +5348,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNetworkEndpointGroupRequest.pb( compute.InsertNetworkEndpointGroupRequest() ) @@ -5294,6 +5378,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5305,6 +5390,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNetworkEndpointGroupsRequest): @@ -5393,10 +5479,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkEndpointGroupsRequest.pb( compute.ListNetworkEndpointGroupsRequest() ) @@ -5422,6 +5511,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupList() + post_with_metadata.return_value = compute.NetworkEndpointGroupList(), metadata client.list( request, @@ -5433,6 +5523,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_network_endpoints_rest_bad_request( @@ -5616,10 +5707,14 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_list_network_endpoints" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, + "post_list_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_list_network_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkEndpointsNetworkEndpointGroupsRequest.pb( compute.ListNetworkEndpointsNetworkEndpointGroupsRequest() ) @@ -5645,6 +5740,10 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupsListNetworkEndpoints() + post_with_metadata.return_value = ( + compute.NetworkEndpointGroupsListNetworkEndpoints(), + metadata, + ) client.list_network_endpoints( request, @@ -5656,6 +5755,7 @@ def test_list_network_endpoints_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( @@ -5818,10 +5918,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.NetworkEndpointGroupsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkEndpointGroupsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsNetworkEndpointGroupRequest.pb( compute.TestIamPermissionsNetworkEndpointGroupRequest() ) @@ -5847,6 +5951,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5858,6 +5963,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_firewall_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_firewall_policies.py index e8d9eb6bbdad..6f35311e312b 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_firewall_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_firewall_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = NetworkFirewallPoliciesClient(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 = NetworkFirewallPoliciesClient(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", [ @@ -6746,10 +6796,14 @@ def test_add_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_add_association" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_add_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_add_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddAssociationNetworkFirewallPolicyRequest.pb( compute.AddAssociationNetworkFirewallPolicyRequest() ) @@ -6773,6 +6827,7 @@ def test_add_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_association( request, @@ -6784,6 +6839,7 @@ def test_add_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_rule_rest_bad_request( @@ -7038,10 +7094,13 @@ def test_add_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_add_rule" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_add_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_add_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddRuleNetworkFirewallPolicyRequest.pb( compute.AddRuleNetworkFirewallPolicyRequest() ) @@ -7065,6 +7124,7 @@ def test_add_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_rule( request, @@ -7076,6 +7136,7 @@ def test_add_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -7168,10 +7229,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNetworkFirewallPoliciesRequest.pb( compute.AggregatedListNetworkFirewallPoliciesRequest() ) @@ -7197,6 +7262,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkFirewallPolicyAggregatedList() + post_with_metadata.return_value = ( + compute.NetworkFirewallPolicyAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -7208,6 +7277,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_clone_rules_rest_bad_request( @@ -7334,10 +7404,14 @@ def test_clone_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_clone_rules" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_clone_rules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_clone_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CloneRulesNetworkFirewallPolicyRequest.pb( compute.CloneRulesNetworkFirewallPolicyRequest() ) @@ -7361,6 +7435,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.clone_rules( request, @@ -7372,6 +7447,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -7498,10 +7574,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNetworkFirewallPolicyRequest.pb( compute.DeleteNetworkFirewallPolicyRequest() ) @@ -7525,6 +7604,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -7536,6 +7616,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNetworkFirewallPolicyRequest): @@ -7642,10 +7723,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkFirewallPolicyRequest.pb( compute.GetNetworkFirewallPolicyRequest() ) @@ -7669,6 +7753,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicy() + post_with_metadata.return_value = compute.FirewallPolicy(), metadata client.get( request, @@ -7680,6 +7765,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_association_rest_bad_request( @@ -7772,10 +7858,14 @@ def test_get_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_get_association" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_get_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_get_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAssociationNetworkFirewallPolicyRequest.pb( compute.GetAssociationNetworkFirewallPolicyRequest() ) @@ -7801,6 +7891,7 @@ def test_get_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyAssociation() + post_with_metadata.return_value = compute.FirewallPolicyAssociation(), metadata client.get_association( request, @@ -7812,6 +7903,7 @@ def test_get_association_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( @@ -7900,10 +7992,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyNetworkFirewallPolicyRequest.pb( compute.GetIamPolicyNetworkFirewallPolicyRequest() ) @@ -7927,6 +8023,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -7938,6 +8035,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_get_rule_rest_bad_request( @@ -8046,10 +8144,13 @@ def test_get_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_get_rule" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_get_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_get_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRuleNetworkFirewallPolicyRequest.pb( compute.GetRuleNetworkFirewallPolicyRequest() ) @@ -8073,6 +8174,7 @@ def test_get_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyRule() + post_with_metadata.return_value = compute.FirewallPolicyRule(), metadata client.get_rule( request, @@ -8084,6 +8186,7 @@ def test_get_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -8369,10 +8472,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNetworkFirewallPolicyRequest.pb( compute.InsertNetworkFirewallPolicyRequest() ) @@ -8396,6 +8502,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -8407,6 +8514,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNetworkFirewallPoliciesRequest): @@ -8493,10 +8601,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkFirewallPoliciesRequest.pb( compute.ListNetworkFirewallPoliciesRequest() ) @@ -8520,6 +8631,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyList() + post_with_metadata.return_value = compute.FirewallPolicyList(), metadata client.list( request, @@ -8531,6 +8643,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchNetworkFirewallPolicyRequest): @@ -8814,10 +8927,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchNetworkFirewallPolicyRequest.pb( compute.PatchNetworkFirewallPolicyRequest() ) @@ -8841,6 +8957,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -8852,6 +8969,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rule_rest_bad_request( @@ -9106,10 +9224,14 @@ def test_patch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_patch_rule" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_patch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_patch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRuleNetworkFirewallPolicyRequest.pb( compute.PatchRuleNetworkFirewallPolicyRequest() ) @@ -9133,6 +9255,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_rule( request, @@ -9144,6 +9267,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_association_rest_bad_request( @@ -9270,10 +9394,14 @@ def test_remove_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_remove_association" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_remove_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_remove_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveAssociationNetworkFirewallPolicyRequest.pb( compute.RemoveAssociationNetworkFirewallPolicyRequest() ) @@ -9297,6 +9425,7 @@ def test_remove_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_association( request, @@ -9308,6 +9437,7 @@ def test_remove_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_rule_rest_bad_request( @@ -9434,10 +9564,14 @@ def test_remove_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_remove_rule" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_remove_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_remove_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveRuleNetworkFirewallPolicyRequest.pb( compute.RemoveRuleNetworkFirewallPolicyRequest() ) @@ -9461,6 +9595,7 @@ def test_remove_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_rule( request, @@ -9472,6 +9607,7 @@ def test_remove_rule_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( @@ -9676,10 +9812,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyNetworkFirewallPolicyRequest.pb( compute.SetIamPolicyNetworkFirewallPolicyRequest() ) @@ -9703,6 +9843,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -9714,6 +9855,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( @@ -9876,10 +10018,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.NetworkFirewallPoliciesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NetworkFirewallPoliciesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsNetworkFirewallPolicyRequest.pb( compute.TestIamPermissionsNetworkFirewallPolicyRequest() ) @@ -9905,6 +10051,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -9916,6 +10063,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_profiles.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_profiles.py index cef89ee04c6f..51ceb5180458 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_profiles.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_network_profiles.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -312,6 +319,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 = NetworkProfilesClient(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 = NetworkProfilesClient(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", [ @@ -1535,10 +1585,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkProfilesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworkProfilesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkProfilesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkProfileRequest.pb( compute.GetNetworkProfileRequest() ) @@ -1562,6 +1615,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkProfile() + post_with_metadata.return_value = compute.NetworkProfile(), metadata client.get( request, @@ -1573,6 +1627,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNetworkProfilesRequest): @@ -1665,10 +1720,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworkProfilesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NetworkProfilesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworkProfilesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkProfilesRequest.pb( compute.ListNetworkProfilesRequest() ) @@ -1694,6 +1752,10 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkProfilesListResponse() + post_with_metadata.return_value = ( + compute.NetworkProfilesListResponse(), + metadata, + ) client.list( request, @@ -1705,6 +1767,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_networks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_networks.py index 2169edfd6c21..d44bd59506b3 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_networks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_networks.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.networks import NetworksClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -287,6 +294,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 = NetworksClient(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 = NetworksClient(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", [ @@ -4911,10 +4961,13 @@ def test_add_peering_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_add_peering" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_add_peering_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_add_peering" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddPeeringNetworkRequest.pb( compute.AddPeeringNetworkRequest() ) @@ -4938,6 +4991,7 @@ def test_add_peering_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_peering( request, @@ -4949,6 +5003,7 @@ def test_add_peering_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteNetworkRequest): @@ -5071,10 +5126,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNetworkRequest.pb(compute.DeleteNetworkRequest()) transcode.return_value = { "method": "post", @@ -5096,6 +5154,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5107,6 +5166,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNetworkRequest): @@ -5222,10 +5282,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNetworkRequest.pb(compute.GetNetworkRequest()) transcode.return_value = { "method": "post", @@ -5247,6 +5310,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Network() + post_with_metadata.return_value = compute.Network(), metadata client.get( request, @@ -5258,6 +5322,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_firewalls_rest_bad_request( @@ -5337,10 +5402,13 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_get_effective_firewalls" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_get_effective_firewalls_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_get_effective_firewalls" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetEffectiveFirewallsNetworkRequest.pb( compute.GetEffectiveFirewallsNetworkRequest() ) @@ -5366,6 +5434,10 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworksGetEffectiveFirewallsResponse() + post_with_metadata.return_value = ( + compute.NetworksGetEffectiveFirewallsResponse(), + metadata, + ) client.get_effective_firewalls( request, @@ -5377,6 +5449,7 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertNetworkRequest): @@ -5609,10 +5682,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNetworkRequest.pb(compute.InsertNetworkRequest()) transcode.return_value = { "method": "post", @@ -5634,6 +5710,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5645,6 +5722,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNetworksRequest): @@ -5731,10 +5809,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworksRequest.pb(compute.ListNetworksRequest()) transcode.return_value = { "method": "post", @@ -5756,6 +5837,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkList() + post_with_metadata.return_value = compute.NetworkList(), metadata client.list( request, @@ -5767,6 +5849,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_peering_routes_rest_bad_request( @@ -5855,10 +5938,13 @@ def test_list_peering_routes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_list_peering_routes" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_list_peering_routes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_list_peering_routes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPeeringRoutesNetworksRequest.pb( compute.ListPeeringRoutesNetworksRequest() ) @@ -5884,6 +5970,7 @@ def test_list_peering_routes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ExchangedPeeringRoutesList() + post_with_metadata.return_value = compute.ExchangedPeeringRoutesList(), metadata client.list_peering_routes( request, @@ -5895,6 +5982,7 @@ def test_list_peering_routes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchNetworkRequest): @@ -6127,10 +6215,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchNetworkRequest.pb(compute.PatchNetworkRequest()) transcode.return_value = { "method": "post", @@ -6152,6 +6243,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6163,6 +6255,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_peering_rest_bad_request( @@ -6368,10 +6461,13 @@ def test_remove_peering_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_remove_peering" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_remove_peering_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_remove_peering" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemovePeeringNetworkRequest.pb( compute.RemovePeeringNetworkRequest() ) @@ -6395,6 +6491,7 @@ def test_remove_peering_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_peering( request, @@ -6406,6 +6503,7 @@ def test_remove_peering_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_switch_to_custom_mode_rest_bad_request( @@ -6530,10 +6628,13 @@ def test_switch_to_custom_mode_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_switch_to_custom_mode" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_switch_to_custom_mode_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_switch_to_custom_mode" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SwitchToCustomModeNetworkRequest.pb( compute.SwitchToCustomModeNetworkRequest() ) @@ -6557,6 +6658,7 @@ def test_switch_to_custom_mode_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.switch_to_custom_mode( request, @@ -6568,6 +6670,7 @@ def test_switch_to_custom_mode_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_peering_rest_bad_request( @@ -6788,10 +6891,13 @@ def test_update_peering_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NetworksRestInterceptor, "post_update_peering" ) as post, mock.patch.object( + transports.NetworksRestInterceptor, "post_update_peering_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NetworksRestInterceptor, "pre_update_peering" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdatePeeringNetworkRequest.pb( compute.UpdatePeeringNetworkRequest() ) @@ -6815,6 +6921,7 @@ def test_update_peering_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_peering( request, @@ -6826,6 +6933,7 @@ def test_update_peering_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-compute/tests/unit/gapic/compute_v1/test_node_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_groups.py index 68be93a84380..dd10bdf9bd3f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -296,6 +303,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 = NodeGroupsClient(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 = NodeGroupsClient(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", [ @@ -6314,10 +6364,13 @@ def test_add_nodes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_add_nodes" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_add_nodes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_add_nodes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddNodesNodeGroupRequest.pb( compute.AddNodesNodeGroupRequest() ) @@ -6341,6 +6394,7 @@ def test_add_nodes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_nodes( request, @@ -6352,6 +6406,7 @@ def test_add_nodes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -6444,10 +6499,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNodeGroupsRequest.pb( compute.AggregatedListNodeGroupsRequest() ) @@ -6473,6 +6531,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeGroupAggregatedList() + post_with_metadata.return_value = compute.NodeGroupAggregatedList(), metadata client.aggregated_list( request, @@ -6484,6 +6543,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteNodeGroupRequest): @@ -6608,10 +6668,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNodeGroupRequest.pb(compute.DeleteNodeGroupRequest()) transcode.return_value = { "method": "post", @@ -6633,6 +6696,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -6644,6 +6708,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_nodes_rest_bad_request( @@ -6853,10 +6918,13 @@ def test_delete_nodes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_delete_nodes" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_delete_nodes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_delete_nodes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNodesNodeGroupRequest.pb( compute.DeleteNodesNodeGroupRequest() ) @@ -6880,6 +6948,7 @@ def test_delete_nodes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_nodes( request, @@ -6891,6 +6960,7 @@ def test_delete_nodes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNodeGroupRequest): @@ -6999,10 +7069,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNodeGroupRequest.pb(compute.GetNodeGroupRequest()) transcode.return_value = { "method": "post", @@ -7024,6 +7097,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeGroup() + post_with_metadata.return_value = compute.NodeGroup(), metadata client.get( request, @@ -7035,6 +7109,7 @@ def test_get_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( @@ -7123,10 +7198,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyNodeGroupRequest.pb( compute.GetIamPolicyNodeGroupRequest() ) @@ -7150,6 +7228,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -7161,6 +7240,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_insert_rest_bad_request(request_type=compute.InsertNodeGroupRequest): @@ -7378,10 +7458,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNodeGroupRequest.pb(compute.InsertNodeGroupRequest()) transcode.return_value = { "method": "post", @@ -7403,6 +7486,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -7414,6 +7498,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNodeGroupsRequest): @@ -7502,10 +7587,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNodeGroupsRequest.pb(compute.ListNodeGroupsRequest()) transcode.return_value = { "method": "post", @@ -7527,6 +7615,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeGroupList() + post_with_metadata.return_value = compute.NodeGroupList(), metadata client.list( request, @@ -7538,6 +7627,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_nodes_rest_bad_request(request_type=compute.ListNodesNodeGroupsRequest): @@ -7626,10 +7716,13 @@ def test_list_nodes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_list_nodes" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_list_nodes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_list_nodes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNodesNodeGroupsRequest.pb( compute.ListNodesNodeGroupsRequest() ) @@ -7655,6 +7748,7 @@ def test_list_nodes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeGroupsListNodes() + post_with_metadata.return_value = compute.NodeGroupsListNodes(), metadata client.list_nodes( request, @@ -7666,6 +7760,7 @@ def test_list_nodes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchNodeGroupRequest): @@ -7883,10 +7978,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchNodeGroupRequest.pb(compute.PatchNodeGroupRequest()) transcode.return_value = { "method": "post", @@ -7908,6 +8006,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -7919,6 +8018,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_perform_maintenance_rest_bad_request( @@ -8131,10 +8231,13 @@ def test_perform_maintenance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_perform_maintenance" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_perform_maintenance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_perform_maintenance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PerformMaintenanceNodeGroupRequest.pb( compute.PerformMaintenanceNodeGroupRequest() ) @@ -8158,6 +8261,7 @@ def test_perform_maintenance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.perform_maintenance( request, @@ -8169,6 +8273,7 @@ def test_perform_maintenance_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( @@ -8373,10 +8478,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyNodeGroupRequest.pb( compute.SetIamPolicyNodeGroupRequest() ) @@ -8400,6 +8508,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -8411,6 +8520,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_set_node_template_rest_bad_request( @@ -8622,10 +8732,13 @@ def test_set_node_template_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_set_node_template" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_set_node_template_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_set_node_template" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetNodeTemplateNodeGroupRequest.pb( compute.SetNodeTemplateNodeGroupRequest() ) @@ -8649,6 +8762,7 @@ def test_set_node_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_node_template( request, @@ -8660,6 +8774,7 @@ def test_set_node_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_simulate_maintenance_event_rest_bad_request( @@ -8871,10 +8986,14 @@ def test_simulate_maintenance_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_simulate_maintenance_event" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, + "post_simulate_maintenance_event_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_simulate_maintenance_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SimulateMaintenanceEventNodeGroupRequest.pb( compute.SimulateMaintenanceEventNodeGroupRequest() ) @@ -8898,6 +9017,7 @@ def test_simulate_maintenance_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.simulate_maintenance_event( request, @@ -8909,6 +9029,7 @@ def test_simulate_maintenance_event_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( @@ -9071,10 +9192,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeGroupsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.NodeGroupsRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeGroupsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsNodeGroupRequest.pb( compute.TestIamPermissionsNodeGroupRequest() ) @@ -9100,6 +9224,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -9111,6 +9236,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_templates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_templates.py index 7e3af94e8164..73e34e42334c 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_templates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_templates.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -315,6 +322,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 = NodeTemplatesClient(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 = NodeTemplatesClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -3275,10 +3325,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNodeTemplatesRequest.pb( compute.AggregatedListNodeTemplatesRequest() ) @@ -3304,6 +3357,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeTemplateAggregatedList() + post_with_metadata.return_value = compute.NodeTemplateAggregatedList(), metadata client.aggregated_list( request, @@ -3315,6 +3369,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteNodeTemplateRequest): @@ -3447,10 +3502,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteNodeTemplateRequest.pb( compute.DeleteNodeTemplateRequest() ) @@ -3474,6 +3532,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3485,6 +3544,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNodeTemplateRequest): @@ -3595,10 +3655,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNodeTemplateRequest.pb(compute.GetNodeTemplateRequest()) transcode.return_value = { "method": "post", @@ -3620,6 +3683,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeTemplate() + post_with_metadata.return_value = compute.NodeTemplate(), metadata client.get( request, @@ -3631,6 +3695,7 @@ def test_get_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( @@ -3719,10 +3784,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyNodeTemplateRequest.pb( compute.GetIamPolicyNodeTemplateRequest() ) @@ -3746,6 +3814,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3757,6 +3826,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_insert_rest_bad_request(request_type=compute.InsertNodeTemplateRequest): @@ -3976,10 +4046,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertNodeTemplateRequest.pb( compute.InsertNodeTemplateRequest() ) @@ -4003,6 +4076,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4014,6 +4088,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNodeTemplatesRequest): @@ -4102,10 +4177,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNodeTemplatesRequest.pb( compute.ListNodeTemplatesRequest() ) @@ -4129,6 +4207,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeTemplateList() + post_with_metadata.return_value = compute.NodeTemplateList(), metadata client.list( request, @@ -4140,6 +4219,7 @@ def test_list_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( @@ -4344,10 +4424,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyNodeTemplateRequest.pb( compute.SetIamPolicyNodeTemplateRequest() ) @@ -4371,6 +4454,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4382,6 +4466,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( @@ -4544,10 +4629,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTemplatesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.NodeTemplatesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.NodeTemplatesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsNodeTemplateRequest.pb( compute.TestIamPermissionsNodeTemplateRequest() ) @@ -4573,6 +4662,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4584,6 +4674,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_types.py index defaf1b6df74..20d947629a32 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_node_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -287,6 +294,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 = NodeTypesClient(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 = NodeTypesClient(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", [ @@ -1781,10 +1831,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTypesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.NodeTypesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTypesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListNodeTypesRequest.pb( compute.AggregatedListNodeTypesRequest() ) @@ -1810,6 +1863,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeTypeAggregatedList() + post_with_metadata.return_value = compute.NodeTypeAggregatedList(), metadata client.aggregated_list( request, @@ -1821,6 +1875,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetNodeTypeRequest): @@ -1921,10 +1976,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.NodeTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNodeTypeRequest.pb(compute.GetNodeTypeRequest()) transcode.return_value = { "method": "post", @@ -1946,6 +2004,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeType() + post_with_metadata.return_value = compute.NodeType(), metadata client.get( request, @@ -1957,6 +2016,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListNodeTypesRequest): @@ -2043,10 +2103,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.NodeTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.NodeTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.NodeTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNodeTypesRequest.pb(compute.ListNodeTypesRequest()) transcode.return_value = { "method": "post", @@ -2068,6 +2131,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NodeTypeList() + post_with_metadata.return_value = compute.NodeTypeList(), metadata client.list( request, @@ -2079,6 +2143,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_packet_mirrorings.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_packet_mirrorings.py index f7803ca9cf6a..1e03ef3326b9 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_packet_mirrorings.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_packet_mirrorings.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = PacketMirroringsClient(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 = PacketMirroringsClient(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", [ @@ -3331,10 +3381,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListPacketMirroringsRequest.pb( compute.AggregatedListPacketMirroringsRequest() ) @@ -3360,6 +3413,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PacketMirroringAggregatedList() + post_with_metadata.return_value = ( + compute.PacketMirroringAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3371,6 +3428,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeletePacketMirroringRequest): @@ -3503,10 +3561,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeletePacketMirroringRequest.pb( compute.DeletePacketMirroringRequest() ) @@ -3530,6 +3591,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3541,6 +3603,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetPacketMirroringRequest): @@ -3647,10 +3710,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetPacketMirroringRequest.pb( compute.GetPacketMirroringRequest() ) @@ -3674,6 +3740,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PacketMirroring() + post_with_metadata.return_value = compute.PacketMirroring(), metadata client.get( request, @@ -3685,6 +3752,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertPacketMirroringRequest): @@ -3907,10 +3975,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertPacketMirroringRequest.pb( compute.InsertPacketMirroringRequest() ) @@ -3934,6 +4005,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3945,6 +4017,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListPacketMirroringsRequest): @@ -4033,10 +4106,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPacketMirroringsRequest.pb( compute.ListPacketMirroringsRequest() ) @@ -4062,6 +4138,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PacketMirroringList() + post_with_metadata.return_value = compute.PacketMirroringList(), metadata client.list( request, @@ -4073,6 +4150,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchPacketMirroringRequest): @@ -4303,10 +4381,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchPacketMirroringRequest.pb( compute.PatchPacketMirroringRequest() ) @@ -4330,6 +4411,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4341,6 +4423,7 @@ def test_patch_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( @@ -4503,10 +4586,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PacketMirroringsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.PacketMirroringsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PacketMirroringsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsPacketMirroringRequest.pb( compute.TestIamPermissionsPacketMirroringRequest() ) @@ -4532,6 +4619,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4543,6 +4631,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_projects.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_projects.py index 8709306363ab..307ce38f7c2f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_projects.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_projects.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.projects import ProjectsClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -287,6 +294,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 = ProjectsClient(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 = ProjectsClient(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", [ @@ -5918,10 +5968,13 @@ def test_disable_xpn_host_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_disable_xpn_host" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_disable_xpn_host_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_disable_xpn_host" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DisableXpnHostProjectRequest.pb( compute.DisableXpnHostProjectRequest() ) @@ -5945,6 +5998,7 @@ def test_disable_xpn_host_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.disable_xpn_host( request, @@ -5956,6 +6010,7 @@ def test_disable_xpn_host_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_xpn_resource_rest_bad_request( @@ -6165,10 +6220,13 @@ def test_disable_xpn_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_disable_xpn_resource" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_disable_xpn_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_disable_xpn_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DisableXpnResourceProjectRequest.pb( compute.DisableXpnResourceProjectRequest() ) @@ -6192,6 +6250,7 @@ def test_disable_xpn_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.disable_xpn_resource( request, @@ -6203,6 +6262,7 @@ def test_disable_xpn_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_xpn_host_rest_bad_request( @@ -6327,10 +6387,13 @@ def test_enable_xpn_host_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_enable_xpn_host" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_enable_xpn_host_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_enable_xpn_host" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.EnableXpnHostProjectRequest.pb( compute.EnableXpnHostProjectRequest() ) @@ -6354,6 +6417,7 @@ def test_enable_xpn_host_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.enable_xpn_host( request, @@ -6365,6 +6429,7 @@ def test_enable_xpn_host_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_xpn_resource_rest_bad_request( @@ -6574,10 +6639,13 @@ def test_enable_xpn_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_enable_xpn_resource" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_enable_xpn_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_enable_xpn_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.EnableXpnResourceProjectRequest.pb( compute.EnableXpnResourceProjectRequest() ) @@ -6601,6 +6669,7 @@ def test_enable_xpn_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.enable_xpn_resource( request, @@ -6612,6 +6681,7 @@ def test_enable_xpn_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetProjectRequest): @@ -6714,10 +6784,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetProjectRequest.pb(compute.GetProjectRequest()) transcode.return_value = { "method": "post", @@ -6739,6 +6812,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Project() + post_with_metadata.return_value = compute.Project(), metadata client.get( request, @@ -6750,6 +6824,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_xpn_host_rest_bad_request(request_type=compute.GetXpnHostProjectRequest): @@ -6852,10 +6927,13 @@ def test_get_xpn_host_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_get_xpn_host" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_get_xpn_host_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_get_xpn_host" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetXpnHostProjectRequest.pb( compute.GetXpnHostProjectRequest() ) @@ -6879,6 +6957,7 @@ def test_get_xpn_host_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Project() + post_with_metadata.return_value = compute.Project(), metadata client.get_xpn_host( request, @@ -6890,6 +6969,7 @@ def test_get_xpn_host_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_xpn_resources_rest_bad_request( @@ -6974,10 +7054,13 @@ def test_get_xpn_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_get_xpn_resources" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_get_xpn_resources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_get_xpn_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetXpnResourcesProjectsRequest.pb( compute.GetXpnResourcesProjectsRequest() ) @@ -7003,6 +7086,7 @@ def test_get_xpn_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ProjectsGetXpnResources() + post_with_metadata.return_value = compute.ProjectsGetXpnResources(), metadata client.get_xpn_resources( request, @@ -7014,6 +7098,7 @@ def test_get_xpn_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_xpn_hosts_rest_bad_request( @@ -7185,10 +7270,13 @@ def test_list_xpn_hosts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_list_xpn_hosts" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_list_xpn_hosts_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_list_xpn_hosts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListXpnHostsProjectsRequest.pb( compute.ListXpnHostsProjectsRequest() ) @@ -7212,6 +7300,7 @@ def test_list_xpn_hosts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.XpnHostList() + post_with_metadata.return_value = compute.XpnHostList(), metadata client.list_xpn_hosts( request, @@ -7223,6 +7312,7 @@ def test_list_xpn_hosts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_disk_rest_bad_request(request_type=compute.MoveDiskProjectRequest): @@ -7422,10 +7512,13 @@ def test_move_disk_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_move_disk" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_move_disk_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_move_disk" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.MoveDiskProjectRequest.pb(compute.MoveDiskProjectRequest()) transcode.return_value = { "method": "post", @@ -7447,6 +7540,7 @@ def test_move_disk_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.move_disk( request, @@ -7458,6 +7552,7 @@ def test_move_disk_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_move_instance_rest_bad_request( @@ -7661,10 +7756,13 @@ def test_move_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_move_instance" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_move_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_move_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.MoveInstanceProjectRequest.pb( compute.MoveInstanceProjectRequest() ) @@ -7688,6 +7786,7 @@ def test_move_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.move_instance( request, @@ -7699,6 +7798,7 @@ def test_move_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_cloud_armor_tier_rest_bad_request( @@ -7908,10 +8008,13 @@ def test_set_cloud_armor_tier_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_set_cloud_armor_tier" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_set_cloud_armor_tier_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_set_cloud_armor_tier" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetCloudArmorTierProjectRequest.pb( compute.SetCloudArmorTierProjectRequest() ) @@ -7935,6 +8038,7 @@ def test_set_cloud_armor_tier_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_cloud_armor_tier( request, @@ -7946,6 +8050,7 @@ def test_set_cloud_armor_tier_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_common_instance_metadata_rest_bad_request( @@ -8144,10 +8249,14 @@ def test_set_common_instance_metadata_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_set_common_instance_metadata" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, + "post_set_common_instance_metadata_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_set_common_instance_metadata" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetCommonInstanceMetadataProjectRequest.pb( compute.SetCommonInstanceMetadataProjectRequest() ) @@ -8171,6 +8280,7 @@ def test_set_common_instance_metadata_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_common_instance_metadata( request, @@ -8182,6 +8292,7 @@ def test_set_common_instance_metadata_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_default_network_tier_rest_bad_request( @@ -8391,10 +8502,14 @@ def test_set_default_network_tier_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_set_default_network_tier" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, + "post_set_default_network_tier_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_set_default_network_tier" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetDefaultNetworkTierProjectRequest.pb( compute.SetDefaultNetworkTierProjectRequest() ) @@ -8418,6 +8533,7 @@ def test_set_default_network_tier_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_default_network_tier( request, @@ -8429,6 +8545,7 @@ def test_set_default_network_tier_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_usage_export_bucket_rest_bad_request( @@ -8632,10 +8749,13 @@ def test_set_usage_export_bucket_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ProjectsRestInterceptor, "post_set_usage_export_bucket" ) as post, mock.patch.object( + transports.ProjectsRestInterceptor, "post_set_usage_export_bucket_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ProjectsRestInterceptor, "pre_set_usage_export_bucket" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetUsageExportBucketProjectRequest.pb( compute.SetUsageExportBucketProjectRequest() ) @@ -8659,6 +8779,7 @@ def test_set_usage_export_bucket_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_usage_export_bucket( request, @@ -8670,6 +8791,7 @@ def test_set_usage_export_bucket_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-compute/tests/unit/gapic/compute_v1/test_public_advertised_prefixes.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_advertised_prefixes.py index 0b8bc67f75c3..ba7961bc0225 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_advertised_prefixes.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_advertised_prefixes.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = PublicAdvertisedPrefixesClient(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 = PublicAdvertisedPrefixesClient(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", [ @@ -3628,10 +3678,14 @@ def test_announce_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_announce" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, + "post_announce_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_announce" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AnnouncePublicAdvertisedPrefixeRequest.pb( compute.AnnouncePublicAdvertisedPrefixeRequest() ) @@ -3655,6 +3709,7 @@ def test_announce_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.announce( request, @@ -3666,6 +3721,7 @@ def test_announce_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3792,10 +3848,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeletePublicAdvertisedPrefixeRequest.pb( compute.DeletePublicAdvertisedPrefixeRequest() ) @@ -3819,6 +3878,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3830,6 +3890,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetPublicAdvertisedPrefixeRequest): @@ -3936,10 +3997,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetPublicAdvertisedPrefixeRequest.pb( compute.GetPublicAdvertisedPrefixeRequest() ) @@ -3965,6 +4029,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicAdvertisedPrefix() + post_with_metadata.return_value = compute.PublicAdvertisedPrefix(), metadata client.get( request, @@ -3976,6 +4041,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4201,10 +4267,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertPublicAdvertisedPrefixeRequest.pb( compute.InsertPublicAdvertisedPrefixeRequest() ) @@ -4228,6 +4297,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4239,6 +4309,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -4329,10 +4400,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPublicAdvertisedPrefixesRequest.pb( compute.ListPublicAdvertisedPrefixesRequest() ) @@ -4358,6 +4432,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicAdvertisedPrefixList() + post_with_metadata.return_value = compute.PublicAdvertisedPrefixList(), metadata client.list( request, @@ -4369,6 +4444,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -4594,10 +4670,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchPublicAdvertisedPrefixeRequest.pb( compute.PatchPublicAdvertisedPrefixeRequest() ) @@ -4621,6 +4700,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4632,6 +4712,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_withdraw_rest_bad_request( @@ -4758,10 +4839,14 @@ def test_withdraw_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "post_withdraw" ) as post, mock.patch.object( + transports.PublicAdvertisedPrefixesRestInterceptor, + "post_withdraw_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PublicAdvertisedPrefixesRestInterceptor, "pre_withdraw" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.WithdrawPublicAdvertisedPrefixeRequest.pb( compute.WithdrawPublicAdvertisedPrefixeRequest() ) @@ -4785,6 +4870,7 @@ def test_withdraw_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.withdraw( request, @@ -4796,6 +4882,7 @@ def test_withdraw_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-compute/tests/unit/gapic/compute_v1/test_public_delegated_prefixes.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_delegated_prefixes.py index 82c3569094ad..278ae4aba242 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_delegated_prefixes.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_public_delegated_prefixes.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = PublicDelegatedPrefixesClient(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 = PublicDelegatedPrefixesClient(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", [ @@ -3972,10 +4022,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListPublicDelegatedPrefixesRequest.pb( compute.AggregatedListPublicDelegatedPrefixesRequest() ) @@ -4001,6 +4055,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicDelegatedPrefixAggregatedList() + post_with_metadata.return_value = ( + compute.PublicDelegatedPrefixAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -4012,6 +4070,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_announce_rest_bad_request( @@ -4146,10 +4205,13 @@ def test_announce_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_announce" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_announce_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_announce" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AnnouncePublicDelegatedPrefixeRequest.pb( compute.AnnouncePublicDelegatedPrefixeRequest() ) @@ -4173,6 +4235,7 @@ def test_announce_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.announce( request, @@ -4184,6 +4247,7 @@ def test_announce_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -4318,10 +4382,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeletePublicDelegatedPrefixeRequest.pb( compute.DeletePublicDelegatedPrefixeRequest() ) @@ -4345,6 +4412,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4356,6 +4424,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetPublicDelegatedPrefixeRequest): @@ -4474,10 +4543,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetPublicDelegatedPrefixeRequest.pb( compute.GetPublicDelegatedPrefixeRequest() ) @@ -4503,6 +4575,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicDelegatedPrefix() + post_with_metadata.return_value = compute.PublicDelegatedPrefix(), metadata client.get( request, @@ -4514,6 +4587,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4745,10 +4819,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertPublicDelegatedPrefixeRequest.pb( compute.InsertPublicDelegatedPrefixeRequest() ) @@ -4772,6 +4849,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4783,6 +4861,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListPublicDelegatedPrefixesRequest): @@ -4871,10 +4950,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPublicDelegatedPrefixesRequest.pb( compute.ListPublicDelegatedPrefixesRequest() ) @@ -4900,6 +4982,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.PublicDelegatedPrefixList() + post_with_metadata.return_value = compute.PublicDelegatedPrefixList(), metadata client.list( request, @@ -4911,6 +4994,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -5150,10 +5234,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchPublicDelegatedPrefixeRequest.pb( compute.PatchPublicDelegatedPrefixeRequest() ) @@ -5177,6 +5264,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -5188,6 +5276,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_withdraw_rest_bad_request( @@ -5322,10 +5411,13 @@ def test_withdraw_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "post_withdraw" ) as post, mock.patch.object( + transports.PublicDelegatedPrefixesRestInterceptor, "post_withdraw_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.PublicDelegatedPrefixesRestInterceptor, "pre_withdraw" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.WithdrawPublicDelegatedPrefixeRequest.pb( compute.WithdrawPublicDelegatedPrefixeRequest() ) @@ -5349,6 +5441,7 @@ def test_withdraw_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.withdraw( request, @@ -5360,6 +5453,7 @@ def test_withdraw_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-compute/tests/unit/gapic/compute_v1/test_region_autoscalers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_autoscalers.py index 0e036605b668..2e1b2f7edc0d 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_autoscalers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_autoscalers.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = RegionAutoscalersClient(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 = RegionAutoscalersClient(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", [ @@ -3296,10 +3346,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionAutoscalerRequest.pb( compute.DeleteRegionAutoscalerRequest() ) @@ -3323,6 +3376,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3334,6 +3388,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionAutoscalerRequest): @@ -3436,10 +3491,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionAutoscalerRequest.pb( compute.GetRegionAutoscalerRequest() ) @@ -3463,6 +3521,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Autoscaler() + post_with_metadata.return_value = compute.Autoscaler(), metadata client.get( request, @@ -3474,6 +3533,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRegionAutoscalerRequest): @@ -3711,10 +3771,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionAutoscalerRequest.pb( compute.InsertRegionAutoscalerRequest() ) @@ -3738,6 +3801,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3749,6 +3813,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionAutoscalersRequest): @@ -3837,10 +3902,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionAutoscalersRequest.pb( compute.ListRegionAutoscalersRequest() ) @@ -3866,6 +3934,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionAutoscalerList() + post_with_metadata.return_value = compute.RegionAutoscalerList(), metadata client.list( request, @@ -3877,6 +3946,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionAutoscalerRequest): @@ -4112,10 +4182,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionAutoscalerRequest.pb( compute.PatchRegionAutoscalerRequest() ) @@ -4139,6 +4212,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4150,6 +4224,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateRegionAutoscalerRequest): @@ -4387,10 +4462,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionAutoscalersRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionAutoscalersRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionAutoscalerRequest.pb( compute.UpdateRegionAutoscalerRequest() ) @@ -4414,6 +4492,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -4425,6 +4504,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_region_backend_services.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_backend_services.py index 197baeef6c17..8f28aa7c667a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_backend_services.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_backend_services.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionBackendServicesClient(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 = RegionBackendServicesClient(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", [ @@ -4885,10 +4935,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionBackendServiceRequest.pb( compute.DeleteRegionBackendServiceRequest() ) @@ -4912,6 +4965,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4923,6 +4977,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionBackendServiceRequest): @@ -5065,10 +5120,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionBackendServiceRequest.pb( compute.GetRegionBackendServiceRequest() ) @@ -5092,6 +5150,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendService() + post_with_metadata.return_value = compute.BackendService(), metadata client.get( request, @@ -5103,6 +5162,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_health_rest_bad_request( @@ -5271,10 +5331,13 @@ def test_get_health_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_get_health" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_get_health_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_get_health" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetHealthRegionBackendServiceRequest.pb( compute.GetHealthRegionBackendServiceRequest() ) @@ -5300,6 +5363,7 @@ def test_get_health_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceGroupHealth() + post_with_metadata.return_value = compute.BackendServiceGroupHealth(), metadata client.get_health( request, @@ -5311,6 +5375,7 @@ def test_get_health_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( @@ -5399,10 +5464,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyRegionBackendServiceRequest.pb( compute.GetIamPolicyRegionBackendServiceRequest() ) @@ -5426,6 +5495,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -5437,6 +5507,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_insert_rest_bad_request( @@ -5804,10 +5875,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionBackendServiceRequest.pb( compute.InsertRegionBackendServiceRequest() ) @@ -5831,6 +5905,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5842,6 +5917,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionBackendServicesRequest): @@ -5930,10 +6006,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionBackendServicesRequest.pb( compute.ListRegionBackendServicesRequest() ) @@ -5957,6 +6036,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceList() + post_with_metadata.return_value = compute.BackendServiceList(), metadata client.list( request, @@ -5968,6 +6048,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_usable_rest_bad_request( @@ -6058,10 +6139,14 @@ def test_list_usable_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_list_usable" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, + "post_list_usable_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_list_usable" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListUsableRegionBackendServicesRequest.pb( compute.ListUsableRegionBackendServicesRequest() ) @@ -6087,6 +6172,7 @@ def test_list_usable_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.BackendServiceListUsable() + post_with_metadata.return_value = compute.BackendServiceListUsable(), metadata client.list_usable( request, @@ -6098,6 +6184,7 @@ def test_list_usable_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionBackendServiceRequest): @@ -6471,10 +6558,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionBackendServiceRequest.pb( compute.PatchRegionBackendServiceRequest() ) @@ -6498,6 +6588,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6509,6 +6600,7 @@ def test_patch_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( @@ -6713,10 +6805,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyRegionBackendServiceRequest.pb( compute.SetIamPolicyRegionBackendServiceRequest() ) @@ -6740,6 +6836,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -6751,6 +6848,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_set_security_policy_rest_bad_request( @@ -6963,10 +7061,14 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_set_security_policy" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, + "post_set_security_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_set_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSecurityPolicyRegionBackendServiceRequest.pb( compute.SetSecurityPolicyRegionBackendServiceRequest() ) @@ -6990,6 +7092,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_security_policy( request, @@ -7001,6 +7104,7 @@ def test_set_security_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( @@ -7163,10 +7267,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsRegionBackendServiceRequest.pb( compute.TestIamPermissionsRegionBackendServiceRequest() ) @@ -7192,6 +7300,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -7203,6 +7312,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_update_rest_bad_request( @@ -7578,10 +7688,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionBackendServicesRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionBackendServicesRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionBackendServiceRequest.pb( compute.UpdateRegionBackendServiceRequest() ) @@ -7605,6 +7718,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -7616,6 +7730,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_region_commitments.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_commitments.py index d75aa1635141..485220a1da92 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_commitments.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_commitments.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = RegionCommitmentsClient(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 = RegionCommitmentsClient(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", [ @@ -2702,10 +2752,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.RegionCommitmentsRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListRegionCommitmentsRequest.pb( compute.AggregatedListRegionCommitmentsRequest() ) @@ -2731,6 +2785,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.CommitmentAggregatedList() + post_with_metadata.return_value = compute.CommitmentAggregatedList(), metadata client.aggregated_list( request, @@ -2742,6 +2797,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionCommitmentRequest): @@ -2860,10 +2916,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionCommitmentsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionCommitmentRequest.pb( compute.GetRegionCommitmentRequest() ) @@ -2887,6 +2946,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Commitment() + post_with_metadata.return_value = compute.Commitment(), metadata client.get( request, @@ -2898,6 +2958,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRegionCommitmentRequest): @@ -3188,10 +3249,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionCommitmentsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionCommitmentRequest.pb( compute.InsertRegionCommitmentRequest() ) @@ -3215,6 +3279,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3226,6 +3291,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionCommitmentsRequest): @@ -3314,10 +3380,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionCommitmentsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionCommitmentsRequest.pb( compute.ListRegionCommitmentsRequest() ) @@ -3341,6 +3410,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.CommitmentList() + post_with_metadata.return_value = compute.CommitmentList(), metadata client.list( request, @@ -3352,6 +3422,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateRegionCommitmentRequest): @@ -3642,10 +3713,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionCommitmentsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionCommitmentsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionCommitmentRequest.pb( compute.UpdateRegionCommitmentRequest() ) @@ -3669,6 +3743,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -3680,6 +3755,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_region_disk_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disk_types.py index a96d22545472..b0d1baab2ef7 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disk_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disk_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -312,6 +319,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 = RegionDiskTypesClient(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 = RegionDiskTypesClient(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", [ @@ -1559,10 +1609,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDiskTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionDiskTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDiskTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionDiskTypeRequest.pb( compute.GetRegionDiskTypeRequest() ) @@ -1586,6 +1639,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskType() + post_with_metadata.return_value = compute.DiskType(), metadata client.get( request, @@ -1597,6 +1651,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionDiskTypesRequest): @@ -1685,10 +1740,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDiskTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionDiskTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDiskTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionDiskTypesRequest.pb( compute.ListRegionDiskTypesRequest() ) @@ -1712,6 +1770,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionDiskTypeList() + post_with_metadata.return_value = compute.RegionDiskTypeList(), metadata client.list( request, @@ -1723,6 +1782,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_region_disks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disks.py index f41249aef4d7..d142bfd0035a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_disks.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = RegionDisksClient(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 = RegionDisksClient(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", [ @@ -7379,10 +7429,14 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_add_resource_policies" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, + "post_add_resource_policies_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_add_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddResourcePoliciesRegionDiskRequest.pb( compute.AddResourcePoliciesRegionDiskRequest() ) @@ -7406,6 +7460,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_resource_policies( request, @@ -7417,6 +7472,7 @@ def test_add_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_insert_rest_bad_request(request_type=compute.BulkInsertRegionDiskRequest): @@ -7619,10 +7675,13 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_bulk_insert" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_bulk_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_bulk_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.BulkInsertRegionDiskRequest.pb( compute.BulkInsertRegionDiskRequest() ) @@ -7646,6 +7705,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.bulk_insert( request, @@ -7657,6 +7717,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_snapshot_rest_bad_request( @@ -7896,10 +7957,13 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_create_snapshot" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_create_snapshot_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_create_snapshot" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CreateSnapshotRegionDiskRequest.pb( compute.CreateSnapshotRegionDiskRequest() ) @@ -7923,6 +7987,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.create_snapshot( request, @@ -7934,6 +7999,7 @@ def test_create_snapshot_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteRegionDiskRequest): @@ -8058,10 +8124,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionDiskRequest.pb( compute.DeleteRegionDiskRequest() ) @@ -8085,6 +8154,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -8096,6 +8166,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionDiskRequest): @@ -8264,10 +8335,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionDiskRequest.pb(compute.GetRegionDiskRequest()) transcode.return_value = { "method": "post", @@ -8289,6 +8363,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Disk() + post_with_metadata.return_value = compute.Disk(), metadata client.get( request, @@ -8300,6 +8375,7 @@ def test_get_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( @@ -8388,10 +8464,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyRegionDiskRequest.pb( compute.GetIamPolicyRegionDiskRequest() ) @@ -8415,6 +8494,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -8426,6 +8506,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_insert_rest_bad_request(request_type=compute.InsertRegionDiskRequest): @@ -8683,10 +8764,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionDiskRequest.pb( compute.InsertRegionDiskRequest() ) @@ -8710,6 +8794,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -8721,6 +8806,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionDisksRequest): @@ -8809,10 +8895,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionDisksRequest.pb(compute.ListRegionDisksRequest()) transcode.return_value = { "method": "post", @@ -8834,6 +8923,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DiskList() + post_with_metadata.return_value = compute.DiskList(), metadata client.list( request, @@ -8845,6 +8935,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_resource_policies_rest_bad_request( @@ -9056,10 +9147,14 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_remove_resource_policies" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, + "post_remove_resource_policies_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_remove_resource_policies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveResourcePoliciesRegionDiskRequest.pb( compute.RemoveResourcePoliciesRegionDiskRequest() ) @@ -9083,6 +9178,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_resource_policies( request, @@ -9094,6 +9190,7 @@ def test_remove_resource_policies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resize_rest_bad_request(request_type=compute.ResizeRegionDiskRequest): @@ -9296,10 +9393,13 @@ def test_resize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_resize" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_resize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_resize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResizeRegionDiskRequest.pb( compute.ResizeRegionDiskRequest() ) @@ -9323,6 +9423,7 @@ def test_resize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resize( request, @@ -9334,6 +9435,7 @@ def test_resize_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( @@ -9538,10 +9640,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyRegionDiskRequest.pb( compute.SetIamPolicyRegionDiskRequest() ) @@ -9565,6 +9670,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -9576,6 +9682,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_set_labels_rest_bad_request(request_type=compute.SetLabelsRegionDiskRequest): @@ -9779,10 +9886,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsRegionDiskRequest.pb( compute.SetLabelsRegionDiskRequest() ) @@ -9806,6 +9916,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -9817,6 +9928,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_start_async_replication_rest_bad_request( @@ -10028,10 +10140,14 @@ def test_start_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_start_async_replication" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, + "post_start_async_replication_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_start_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartAsyncReplicationRegionDiskRequest.pb( compute.StartAsyncReplicationRegionDiskRequest() ) @@ -10055,6 +10171,7 @@ def test_start_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start_async_replication( request, @@ -10066,6 +10183,7 @@ def test_start_async_replication_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_async_replication_rest_bad_request( @@ -10192,10 +10310,14 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_stop_async_replication" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, + "post_stop_async_replication_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_stop_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopAsyncReplicationRegionDiskRequest.pb( compute.StopAsyncReplicationRegionDiskRequest() ) @@ -10219,6 +10341,7 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_async_replication( request, @@ -10230,6 +10353,7 @@ def test_stop_async_replication_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_group_async_replication_rest_bad_request( @@ -10441,10 +10565,14 @@ def test_stop_group_async_replication_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_stop_group_async_replication" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, + "post_stop_group_async_replication_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_stop_group_async_replication" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopGroupAsyncReplicationRegionDiskRequest.pb( compute.StopGroupAsyncReplicationRegionDiskRequest() ) @@ -10468,6 +10596,7 @@ def test_stop_group_async_replication_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_group_async_replication( request, @@ -10479,6 +10608,7 @@ def test_stop_group_async_replication_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( @@ -10641,10 +10771,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsRegionDiskRequest.pb( compute.TestIamPermissionsRegionDiskRequest() ) @@ -10670,6 +10803,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -10681,6 +10815,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_update_rest_bad_request(request_type=compute.UpdateRegionDiskRequest): @@ -10938,10 +11073,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionDisksRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionDisksRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionDisksRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionDiskRequest.pb( compute.UpdateRegionDiskRequest() ) @@ -10965,6 +11103,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -10976,6 +11115,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_region_health_check_services.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_check_services.py index 61243c2c0224..8e8f7dd18ac4 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_check_services.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_check_services.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionHealthCheckServicesClient(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 = RegionHealthCheckServicesClient(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", [ @@ -2910,10 +2960,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionHealthCheckServicesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionHealthCheckServiceRequest.pb( compute.DeleteRegionHealthCheckServiceRequest() ) @@ -2937,6 +2990,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2948,6 +3002,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionHealthCheckServiceRequest): @@ -3063,10 +3118,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionHealthCheckServicesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionHealthCheckServiceRequest.pb( compute.GetRegionHealthCheckServiceRequest() ) @@ -3090,6 +3148,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheckService() + post_with_metadata.return_value = compute.HealthCheckService(), metadata client.get( request, @@ -3101,6 +3160,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -3322,10 +3382,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionHealthCheckServicesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionHealthCheckServiceRequest.pb( compute.InsertRegionHealthCheckServiceRequest() ) @@ -3349,6 +3412,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3360,6 +3424,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -3450,10 +3515,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionHealthCheckServicesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionHealthCheckServicesRequest.pb( compute.ListRegionHealthCheckServicesRequest() ) @@ -3479,6 +3547,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheckServicesList() + post_with_metadata.return_value = compute.HealthCheckServicesList(), metadata client.list( request, @@ -3490,6 +3559,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -3719,10 +3789,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionHealthCheckServicesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthCheckServicesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionHealthCheckServiceRequest.pb( compute.PatchRegionHealthCheckServiceRequest() ) @@ -3746,6 +3819,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -3757,6 +3831,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_region_health_checks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_checks.py index 4c9953b753ac..55408aa602a4 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_checks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_health_checks.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -332,6 +339,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 = RegionHealthChecksClient(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 = RegionHealthChecksClient(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", [ @@ -3288,10 +3338,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionHealthCheckRequest.pb( compute.DeleteRegionHealthCheckRequest() ) @@ -3315,6 +3368,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3326,6 +3380,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionHealthCheckRequest): @@ -3440,10 +3495,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionHealthCheckRequest.pb( compute.GetRegionHealthCheckRequest() ) @@ -3467,6 +3525,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheck() + post_with_metadata.return_value = compute.HealthCheck(), metadata client.get( request, @@ -3478,6 +3537,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRegionHealthCheckRequest): @@ -3738,10 +3798,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionHealthCheckRequest.pb( compute.InsertRegionHealthCheckRequest() ) @@ -3765,6 +3828,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3776,6 +3840,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionHealthChecksRequest): @@ -3864,10 +3929,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionHealthChecksRequest.pb( compute.ListRegionHealthChecksRequest() ) @@ -3891,6 +3959,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.HealthCheckList() + post_with_metadata.return_value = compute.HealthCheckList(), metadata client.list( request, @@ -3902,6 +3971,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionHealthCheckRequest): @@ -4170,10 +4240,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionHealthCheckRequest.pb( compute.PatchRegionHealthCheckRequest() ) @@ -4197,6 +4270,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4208,6 +4282,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateRegionHealthCheckRequest): @@ -4476,10 +4551,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionHealthChecksRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionHealthChecksRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionHealthCheckRequest.pb( compute.UpdateRegionHealthCheckRequest() ) @@ -4503,6 +4581,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -4514,6 +4593,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_region_instance_group_managers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_group_managers.py index 3de03fd1e41e..c146dd13a86b 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_group_managers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_group_managers.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionInstanceGroupManagersClient(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 = RegionInstanceGroupManagersClient(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", [ @@ -10562,10 +10612,14 @@ def test_abandon_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_abandon_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_abandon_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_abandon_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AbandonInstancesRegionInstanceGroupManagerRequest.pb( compute.AbandonInstancesRegionInstanceGroupManagerRequest() ) @@ -10589,6 +10643,7 @@ def test_abandon_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.abandon_instances( request, @@ -10600,6 +10655,7 @@ def test_abandon_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_updates_to_instances_rest_bad_request( @@ -10825,11 +10881,15 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_apply_updates_to_instances", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_apply_updates_to_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_apply_updates_to_instances", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( compute.ApplyUpdatesToInstancesRegionInstanceGroupManagerRequest.pb( compute.ApplyUpdatesToInstancesRegionInstanceGroupManagerRequest() @@ -10855,6 +10915,7 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.apply_updates_to_instances( request, @@ -10866,6 +10927,7 @@ def test_apply_updates_to_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_instances_rest_bad_request( @@ -11097,10 +11159,14 @@ def test_create_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_create_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_create_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_create_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CreateInstancesRegionInstanceGroupManagerRequest.pb( compute.CreateInstancesRegionInstanceGroupManagerRequest() ) @@ -11124,6 +11190,7 @@ def test_create_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.create_instances( request, @@ -11135,6 +11202,7 @@ def test_create_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -11269,10 +11337,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionInstanceGroupManagerRequest.pb( compute.DeleteRegionInstanceGroupManagerRequest() ) @@ -11296,6 +11368,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -11307,6 +11380,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instances_rest_bad_request( @@ -11527,10 +11601,14 @@ def test_delete_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_delete_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_delete_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_delete_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteInstancesRegionInstanceGroupManagerRequest.pb( compute.DeleteInstancesRegionInstanceGroupManagerRequest() ) @@ -11554,6 +11632,7 @@ def test_delete_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_instances( request, @@ -11565,6 +11644,7 @@ def test_delete_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_per_instance_configs_rest_bad_request( @@ -11787,11 +11867,15 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_delete_per_instance_configs", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_delete_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_delete_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( compute.DeletePerInstanceConfigsRegionInstanceGroupManagerRequest.pb( compute.DeletePerInstanceConfigsRegionInstanceGroupManagerRequest() @@ -11817,6 +11901,7 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete_per_instance_configs( request, @@ -11828,6 +11913,7 @@ def test_delete_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -11959,10 +12045,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionInstanceGroupManagerRequest.pb( compute.GetRegionInstanceGroupManagerRequest() ) @@ -11988,6 +12077,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroupManager() + post_with_metadata.return_value = compute.InstanceGroupManager(), metadata client.get( request, @@ -11999,6 +12089,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -12283,10 +12374,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionInstanceGroupManagerRequest.pb( compute.InsertRegionInstanceGroupManagerRequest() ) @@ -12310,6 +12405,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -12321,6 +12417,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -12411,10 +12508,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionInstanceGroupManagersRequest.pb( compute.ListRegionInstanceGroupManagersRequest() ) @@ -12440,6 +12540,10 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupManagerList() + post_with_metadata.return_value = ( + compute.RegionInstanceGroupManagerList(), + metadata, + ) client.list( request, @@ -12451,6 +12555,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_errors_rest_bad_request( @@ -12545,10 +12650,14 @@ def test_list_errors_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_list_errors" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_list_errors_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_list_errors" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListErrorsRegionInstanceGroupManagersRequest.pb( compute.ListErrorsRegionInstanceGroupManagersRequest() ) @@ -12574,6 +12683,10 @@ def test_list_errors_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupManagersListErrorsResponse() + post_with_metadata.return_value = ( + compute.RegionInstanceGroupManagersListErrorsResponse(), + metadata, + ) client.list_errors( request, @@ -12585,6 +12698,7 @@ def test_list_errors_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_managed_instances_rest_bad_request( @@ -12680,11 +12794,15 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_list_managed_instances", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_list_managed_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_list_managed_instances", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListManagedInstancesRegionInstanceGroupManagersRequest.pb( compute.ListManagedInstancesRegionInstanceGroupManagersRequest() ) @@ -12710,6 +12828,10 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupManagersListInstancesResponse() + post_with_metadata.return_value = ( + compute.RegionInstanceGroupManagersListInstancesResponse(), + metadata, + ) client.list_managed_instances( request, @@ -12721,6 +12843,7 @@ def test_list_managed_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_per_instance_configs_rest_bad_request( @@ -12816,11 +12939,15 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_list_per_instance_configs", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_list_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_list_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( compute.ListPerInstanceConfigsRegionInstanceGroupManagersRequest.pb( compute.ListPerInstanceConfigsRegionInstanceGroupManagersRequest() @@ -12850,6 +12977,10 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupManagersListInstanceConfigsResp() + post_with_metadata.return_value = ( + compute.RegionInstanceGroupManagersListInstanceConfigsResp(), + metadata, + ) client.list_per_instance_configs( request, @@ -12861,6 +12992,7 @@ def test_list_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -13153,10 +13285,14 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_patch_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionInstanceGroupManagerRequest.pb( compute.PatchRegionInstanceGroupManagerRequest() ) @@ -13180,6 +13316,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -13191,6 +13328,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_per_instance_configs_rest_bad_request( @@ -13425,11 +13563,15 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_patch_per_instance_configs", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_patch_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_patch_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( compute.PatchPerInstanceConfigsRegionInstanceGroupManagerRequest.pb( compute.PatchPerInstanceConfigsRegionInstanceGroupManagerRequest() @@ -13455,6 +13597,7 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_per_instance_configs( request, @@ -13466,6 +13609,7 @@ def test_patch_per_instance_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_recreate_instances_rest_bad_request( @@ -13685,10 +13829,14 @@ def test_recreate_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_recreate_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_recreate_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_recreate_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RecreateInstancesRegionInstanceGroupManagerRequest.pb( compute.RecreateInstancesRegionInstanceGroupManagerRequest() ) @@ -13712,6 +13860,7 @@ def test_recreate_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.recreate_instances( request, @@ -13723,6 +13872,7 @@ def test_recreate_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resize_rest_bad_request( @@ -13857,10 +14007,14 @@ def test_resize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_resize" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_resize_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_resize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResizeRegionInstanceGroupManagerRequest.pb( compute.ResizeRegionInstanceGroupManagerRequest() ) @@ -13884,6 +14038,7 @@ def test_resize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resize( request, @@ -13895,6 +14050,7 @@ def test_resize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_instances_rest_bad_request( @@ -14114,10 +14270,14 @@ def test_resume_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_resume_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_resume_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_resume_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResumeInstancesRegionInstanceGroupManagerRequest.pb( compute.ResumeInstancesRegionInstanceGroupManagerRequest() ) @@ -14141,6 +14301,7 @@ def test_resume_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resume_instances( request, @@ -14152,6 +14313,7 @@ def test_resume_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_instance_template_rest_bad_request( @@ -14374,11 +14536,15 @@ def test_set_instance_template_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_set_instance_template", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_set_instance_template_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_set_instance_template", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetInstanceTemplateRegionInstanceGroupManagerRequest.pb( compute.SetInstanceTemplateRegionInstanceGroupManagerRequest() ) @@ -14402,6 +14568,7 @@ def test_set_instance_template_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_instance_template( request, @@ -14413,6 +14580,7 @@ def test_set_instance_template_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_target_pools_rest_bad_request( @@ -14633,10 +14801,14 @@ def test_set_target_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_set_target_pools" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_set_target_pools_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_set_target_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetTargetPoolsRegionInstanceGroupManagerRequest.pb( compute.SetTargetPoolsRegionInstanceGroupManagerRequest() ) @@ -14660,6 +14832,7 @@ def test_set_target_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_target_pools( request, @@ -14671,6 +14844,7 @@ def test_set_target_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_instances_rest_bad_request( @@ -14890,10 +15064,14 @@ def test_start_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_start_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_start_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_start_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StartInstancesRegionInstanceGroupManagerRequest.pb( compute.StartInstancesRegionInstanceGroupManagerRequest() ) @@ -14917,6 +15095,7 @@ def test_start_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.start_instances( request, @@ -14928,6 +15107,7 @@ def test_start_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_instances_rest_bad_request( @@ -15148,10 +15328,14 @@ def test_stop_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_stop_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_stop_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_stop_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.StopInstancesRegionInstanceGroupManagerRequest.pb( compute.StopInstancesRegionInstanceGroupManagerRequest() ) @@ -15175,6 +15359,7 @@ def test_stop_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.stop_instances( request, @@ -15186,6 +15371,7 @@ def test_stop_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_suspend_instances_rest_bad_request( @@ -15405,10 +15591,14 @@ def test_suspend_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "post_suspend_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_suspend_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_suspend_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SuspendInstancesRegionInstanceGroupManagerRequest.pb( compute.SuspendInstancesRegionInstanceGroupManagerRequest() ) @@ -15432,6 +15622,7 @@ def test_suspend_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.suspend_instances( request, @@ -15443,6 +15634,7 @@ def test_suspend_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_per_instance_configs_rest_bad_request( @@ -15679,11 +15871,15 @@ def test_update_per_instance_configs_rest_interceptors(null_interceptor): transports.RegionInstanceGroupManagersRestInterceptor, "post_update_per_instance_configs", ) as post, mock.patch.object( + transports.RegionInstanceGroupManagersRestInterceptor, + "post_update_per_instance_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupManagersRestInterceptor, "pre_update_per_instance_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( compute.UpdatePerInstanceConfigsRegionInstanceGroupManagerRequest.pb( compute.UpdatePerInstanceConfigsRegionInstanceGroupManagerRequest() @@ -15709,6 +15905,7 @@ def test_update_per_instance_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update_per_instance_configs( request, @@ -15720,6 +15917,7 @@ def test_update_per_instance_configs_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-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py index 535dfaeaef4d..d8eb061a6fa9 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionInstanceGroupsClient(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 = RegionInstanceGroupsClient(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", [ @@ -2343,10 +2393,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionInstanceGroupRequest.pb( compute.GetRegionInstanceGroupRequest() ) @@ -2370,6 +2423,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceGroup() + post_with_metadata.return_value = compute.InstanceGroup(), metadata client.get( request, @@ -2381,6 +2435,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionInstanceGroupsRequest): @@ -2469,10 +2524,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionInstanceGroupsRequest.pb( compute.ListRegionInstanceGroupsRequest() ) @@ -2498,6 +2556,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupList() + post_with_metadata.return_value = compute.RegionInstanceGroupList(), metadata client.list( request, @@ -2509,6 +2568,7 @@ def test_list_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( @@ -2693,10 +2753,14 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, + "post_list_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListInstancesRegionInstanceGroupsRequest.pb( compute.ListInstancesRegionInstanceGroupsRequest() ) @@ -2722,6 +2786,10 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionInstanceGroupsListInstances() + post_with_metadata.return_value = ( + compute.RegionInstanceGroupsListInstances(), + metadata, + ) client.list_instances( request, @@ -2733,6 +2801,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_set_named_ports_rest_bad_request( @@ -2953,10 +3022,14 @@ def test_set_named_ports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "post_set_named_ports" ) as post, mock.patch.object( + transports.RegionInstanceGroupsRestInterceptor, + "post_set_named_ports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceGroupsRestInterceptor, "pre_set_named_ports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetNamedPortsRegionInstanceGroupRequest.pb( compute.SetNamedPortsRegionInstanceGroupRequest() ) @@ -2980,6 +3053,7 @@ def test_set_named_ports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_named_ports( request, @@ -2991,6 +3065,7 @@ def test_set_named_ports_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-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py index cafda09c012f..779f2177682d 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instance_templates.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionInstanceTemplatesClient(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 = RegionInstanceTemplatesClient(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", [ @@ -2466,10 +2516,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionInstanceTemplatesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionInstanceTemplateRequest.pb( compute.DeleteRegionInstanceTemplateRequest() ) @@ -2493,6 +2546,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2504,6 +2558,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionInstanceTemplateRequest): @@ -2608,10 +2663,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionInstanceTemplatesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionInstanceTemplateRequest.pb( compute.GetRegionInstanceTemplateRequest() ) @@ -2635,6 +2693,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceTemplate() + post_with_metadata.return_value = compute.InstanceTemplate(), metadata client.get( request, @@ -2646,6 +2705,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -2839,6 +2899,7 @@ def test_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -3042,10 +3103,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionInstanceTemplatesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionInstanceTemplateRequest.pb( compute.InsertRegionInstanceTemplateRequest() ) @@ -3069,6 +3133,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3080,6 +3145,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionInstanceTemplatesRequest): @@ -3168,10 +3234,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionInstanceTemplatesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstanceTemplatesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionInstanceTemplatesRequest.pb( compute.ListRegionInstanceTemplatesRequest() ) @@ -3197,6 +3266,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstanceTemplateList() + post_with_metadata.return_value = compute.InstanceTemplateList(), metadata client.list( request, @@ -3208,6 +3278,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_region_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py index 5347ad371589..6cd7e21d388e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instances.py @@ -65,6 +65,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionInstancesClient(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 = RegionInstancesClient(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", [ @@ -1596,6 +1646,7 @@ def test_bulk_insert_rest_call_success(request_type): "scheduling": { "automatic_restart": True, "availability_domain": 2002, + "host_error_timeout_seconds": 2811, "instance_termination_action": "instance_termination_action_value", "local_ssd_recovery_timeout": {"nanos": 543, "seconds": 751}, "location_hint": "location_hint_value", @@ -1796,10 +1847,13 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstancesRestInterceptor, "post_bulk_insert" ) as post, mock.patch.object( + transports.RegionInstancesRestInterceptor, "post_bulk_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstancesRestInterceptor, "pre_bulk_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.BulkInsertRegionInstanceRequest.pb( compute.BulkInsertRegionInstanceRequest() ) @@ -1823,6 +1877,7 @@ def test_bulk_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.bulk_insert( request, @@ -1834,6 +1889,7 @@ def test_bulk_insert_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-compute/tests/unit/gapic/compute_v1/test_region_instant_snapshots.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instant_snapshots.py index 04b32415b203..ba0bfcfdd050 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instant_snapshots.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_instant_snapshots.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionInstantSnapshotsClient(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 = RegionInstantSnapshotsClient(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", [ @@ -3529,10 +3579,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionInstantSnapshotRequest.pb( compute.DeleteRegionInstantSnapshotRequest() ) @@ -3556,6 +3609,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3567,6 +3621,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionInstantSnapshotRequest): @@ -3689,10 +3744,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionInstantSnapshotRequest.pb( compute.GetRegionInstantSnapshotRequest() ) @@ -3716,6 +3774,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstantSnapshot() + post_with_metadata.return_value = compute.InstantSnapshot(), metadata client.get( request, @@ -3727,6 +3786,7 @@ def test_get_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( @@ -3815,10 +3875,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyRegionInstantSnapshotRequest.pb( compute.GetIamPolicyRegionInstantSnapshotRequest() ) @@ -3842,6 +3906,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3853,6 +3918,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_insert_rest_bad_request( @@ -4073,10 +4139,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionInstantSnapshotRequest.pb( compute.InsertRegionInstantSnapshotRequest() ) @@ -4100,6 +4169,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4111,6 +4181,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionInstantSnapshotsRequest): @@ -4199,10 +4270,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionInstantSnapshotsRequest.pb( compute.ListRegionInstantSnapshotsRequest() ) @@ -4228,6 +4302,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.InstantSnapshotList() + post_with_metadata.return_value = compute.InstantSnapshotList(), metadata client.list( request, @@ -4239,6 +4314,7 @@ def test_list_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( @@ -4443,10 +4519,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyRegionInstantSnapshotRequest.pb( compute.SetIamPolicyRegionInstantSnapshotRequest() ) @@ -4470,6 +4550,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4481,6 +4562,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_set_labels_rest_bad_request( @@ -4686,10 +4768,14 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, + "post_set_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsRegionInstantSnapshotRequest.pb( compute.SetLabelsRegionInstantSnapshotRequest() ) @@ -4713,6 +4799,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4724,6 +4811,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_test_iam_permissions_rest_bad_request( @@ -4886,10 +4974,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.RegionInstantSnapshotsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionInstantSnapshotsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsRegionInstantSnapshotRequest.pb( compute.TestIamPermissionsRegionInstantSnapshotRequest() ) @@ -4915,6 +5007,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4926,6 +5019,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_endpoint_groups.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_endpoint_groups.py index 2818411dae10..519d47e6d816 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_endpoint_groups.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_endpoint_groups.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionNetworkEndpointGroupsClient(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 = RegionNetworkEndpointGroupsClient(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", [ @@ -3782,11 +3832,15 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): transports.RegionNetworkEndpointGroupsRestInterceptor, "post_attach_network_endpoints", ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, + "post_attach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_attach_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AttachNetworkEndpointsRegionNetworkEndpointGroupRequest.pb( compute.AttachNetworkEndpointsRegionNetworkEndpointGroupRequest() ) @@ -3810,6 +3864,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.attach_network_endpoints( request, @@ -3821,6 +3876,7 @@ def test_attach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -3955,10 +4011,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionNetworkEndpointGroupRequest.pb( compute.DeleteRegionNetworkEndpointGroupRequest() ) @@ -3982,6 +4042,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3993,6 +4054,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_detach_network_endpoints_rest_bad_request( @@ -4225,11 +4287,15 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): transports.RegionNetworkEndpointGroupsRestInterceptor, "post_detach_network_endpoints", ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, + "post_detach_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_detach_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DetachNetworkEndpointsRegionNetworkEndpointGroupRequest.pb( compute.DetachNetworkEndpointsRegionNetworkEndpointGroupRequest() ) @@ -4253,6 +4319,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.detach_network_endpoints( request, @@ -4264,6 +4331,7 @@ def test_detach_network_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -4382,10 +4450,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionNetworkEndpointGroupRequest.pb( compute.GetRegionNetworkEndpointGroupRequest() ) @@ -4411,6 +4482,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroup() + post_with_metadata.return_value = compute.NetworkEndpointGroup(), metadata client.get( request, @@ -4422,6 +4494,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4657,10 +4730,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionNetworkEndpointGroupRequest.pb( compute.InsertRegionNetworkEndpointGroupRequest() ) @@ -4684,6 +4761,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4695,6 +4773,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -4785,10 +4864,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionNetworkEndpointGroupsRequest.pb( compute.ListRegionNetworkEndpointGroupsRequest() ) @@ -4814,6 +4896,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupList() + post_with_metadata.return_value = compute.NetworkEndpointGroupList(), metadata client.list( request, @@ -4825,6 +4908,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_network_endpoints_rest_bad_request( @@ -4924,11 +5008,15 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): transports.RegionNetworkEndpointGroupsRestInterceptor, "post_list_network_endpoints", ) as post, mock.patch.object( + transports.RegionNetworkEndpointGroupsRestInterceptor, + "post_list_network_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkEndpointGroupsRestInterceptor, "pre_list_network_endpoints", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListNetworkEndpointsRegionNetworkEndpointGroupsRequest.pb( compute.ListNetworkEndpointsRegionNetworkEndpointGroupsRequest() ) @@ -4954,6 +5042,10 @@ def test_list_network_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NetworkEndpointGroupsListNetworkEndpoints() + post_with_metadata.return_value = ( + compute.NetworkEndpointGroupsListNetworkEndpoints(), + metadata, + ) client.list_network_endpoints( request, @@ -4965,6 +5057,7 @@ def test_list_network_endpoints_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-compute/tests/unit/gapic/compute_v1/test_region_network_firewall_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_firewall_policies.py index 0a37e80df5ba..01e53e03d63f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_firewall_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_network_firewall_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -348,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 = RegionNetworkFirewallPoliciesClient(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 = RegionNetworkFirewallPoliciesClient(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", [ @@ -6989,10 +7039,14 @@ def test_add_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_add_association" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_add_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_add_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddAssociationRegionNetworkFirewallPolicyRequest.pb( compute.AddAssociationRegionNetworkFirewallPolicyRequest() ) @@ -7016,6 +7070,7 @@ def test_add_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_association( request, @@ -7027,6 +7082,7 @@ def test_add_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_rule_rest_bad_request( @@ -7289,10 +7345,14 @@ def test_add_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_add_rule" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_add_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_add_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddRuleRegionNetworkFirewallPolicyRequest.pb( compute.AddRuleRegionNetworkFirewallPolicyRequest() ) @@ -7316,6 +7376,7 @@ def test_add_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_rule( request, @@ -7327,6 +7388,7 @@ def test_add_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_clone_rules_rest_bad_request( @@ -7461,10 +7523,14 @@ def test_clone_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_clone_rules" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_clone_rules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_clone_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.CloneRulesRegionNetworkFirewallPolicyRequest.pb( compute.CloneRulesRegionNetworkFirewallPolicyRequest() ) @@ -7488,6 +7554,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.clone_rules( request, @@ -7499,6 +7566,7 @@ def test_clone_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -7633,10 +7701,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionNetworkFirewallPolicyRequest.pb( compute.DeleteRegionNetworkFirewallPolicyRequest() ) @@ -7660,6 +7732,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -7671,6 +7744,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -7787,10 +7861,14 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_get_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionNetworkFirewallPolicyRequest.pb( compute.GetRegionNetworkFirewallPolicyRequest() ) @@ -7814,6 +7892,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicy() + post_with_metadata.return_value = compute.FirewallPolicy(), metadata client.get( request, @@ -7825,6 +7904,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_association_rest_bad_request( @@ -7925,10 +8005,14 @@ def test_get_association_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_get_association" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_get_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_get_association" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetAssociationRegionNetworkFirewallPolicyRequest.pb( compute.GetAssociationRegionNetworkFirewallPolicyRequest() ) @@ -7954,6 +8038,7 @@ def test_get_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyAssociation() + post_with_metadata.return_value = compute.FirewallPolicyAssociation(), metadata client.get_association( request, @@ -7965,6 +8050,7 @@ def test_get_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_firewalls_rest_bad_request( @@ -8055,11 +8141,15 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_get_effective_firewalls", ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_get_effective_firewalls_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_get_effective_firewalls", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetEffectiveFirewallsRegionNetworkFirewallPolicyRequest.pb( compute.GetEffectiveFirewallsRegionNetworkFirewallPolicyRequest() ) @@ -8089,6 +8179,10 @@ def test_get_effective_firewalls_rest_interceptors(null_interceptor): post.return_value = ( compute.RegionNetworkFirewallPoliciesGetEffectiveFirewallsResponse() ) + post_with_metadata.return_value = ( + compute.RegionNetworkFirewallPoliciesGetEffectiveFirewallsResponse(), + metadata, + ) client.get_effective_firewalls( request, @@ -8100,6 +8194,7 @@ def test_get_effective_firewalls_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( @@ -8188,10 +8283,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyRegionNetworkFirewallPolicyRequest.pb( compute.GetIamPolicyRegionNetworkFirewallPolicyRequest() ) @@ -8215,6 +8314,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -8226,6 +8326,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_get_rule_rest_bad_request( @@ -8342,10 +8443,14 @@ def test_get_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_get_rule" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_get_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_get_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRuleRegionNetworkFirewallPolicyRequest.pb( compute.GetRuleRegionNetworkFirewallPolicyRequest() ) @@ -8369,6 +8474,7 @@ def test_get_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyRule() + post_with_metadata.return_value = compute.FirewallPolicyRule(), metadata client.get_rule( request, @@ -8380,6 +8486,7 @@ def test_get_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -8665,10 +8772,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionNetworkFirewallPolicyRequest.pb( compute.InsertRegionNetworkFirewallPolicyRequest() ) @@ -8692,6 +8803,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -8703,6 +8815,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -8791,10 +8904,14 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionNetworkFirewallPoliciesRequest.pb( compute.ListRegionNetworkFirewallPoliciesRequest() ) @@ -8818,6 +8935,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.FirewallPolicyList() + post_with_metadata.return_value = compute.FirewallPolicyList(), metadata client.list( request, @@ -8829,6 +8947,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -9122,10 +9241,14 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_patch_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionNetworkFirewallPolicyRequest.pb( compute.PatchRegionNetworkFirewallPolicyRequest() ) @@ -9149,6 +9272,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -9160,6 +9284,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rule_rest_bad_request( @@ -9422,10 +9547,14 @@ def test_patch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_patch_rule" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_patch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_patch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRuleRegionNetworkFirewallPolicyRequest.pb( compute.PatchRuleRegionNetworkFirewallPolicyRequest() ) @@ -9449,6 +9578,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_rule( request, @@ -9460,6 +9590,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_association_rest_bad_request( @@ -9595,11 +9726,15 @@ def test_remove_association_rest_interceptors(null_interceptor): transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_remove_association", ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_remove_association_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_remove_association", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveAssociationRegionNetworkFirewallPolicyRequest.pb( compute.RemoveAssociationRegionNetworkFirewallPolicyRequest() ) @@ -9623,6 +9758,7 @@ def test_remove_association_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_association( request, @@ -9634,6 +9770,7 @@ def test_remove_association_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_rule_rest_bad_request( @@ -9768,10 +9905,14 @@ def test_remove_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_remove_rule" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_remove_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_remove_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveRuleRegionNetworkFirewallPolicyRequest.pb( compute.RemoveRuleRegionNetworkFirewallPolicyRequest() ) @@ -9795,6 +9936,7 @@ def test_remove_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_rule( request, @@ -9806,6 +9948,7 @@ def test_remove_rule_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( @@ -10010,10 +10153,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyRegionNetworkFirewallPolicyRequest.pb( compute.SetIamPolicyRegionNetworkFirewallPolicyRequest() ) @@ -10037,6 +10184,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -10048,6 +10196,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( @@ -10213,11 +10362,15 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): transports.RegionNetworkFirewallPoliciesRestInterceptor, "post_test_iam_permissions", ) as post, mock.patch.object( + transports.RegionNetworkFirewallPoliciesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNetworkFirewallPoliciesRestInterceptor, "pre_test_iam_permissions", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsRegionNetworkFirewallPolicyRequest.pb( compute.TestIamPermissionsRegionNetworkFirewallPolicyRequest() ) @@ -10243,6 +10396,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -10254,6 +10408,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_notification_endpoints.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_notification_endpoints.py index dffefa1e54fb..ebe10d87780f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_notification_endpoints.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_notification_endpoints.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionNotificationEndpointsClient(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 = RegionNotificationEndpointsClient(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", [ @@ -2480,10 +2530,14 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionNotificationEndpointsRestInterceptor, + "post_delete_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionNotificationEndpointRequest.pb( compute.DeleteRegionNotificationEndpointRequest() ) @@ -2507,6 +2561,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2518,6 +2573,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request( @@ -2622,10 +2678,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionNotificationEndpointsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionNotificationEndpointRequest.pb( compute.GetRegionNotificationEndpointRequest() ) @@ -2651,6 +2710,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NotificationEndpoint() + post_with_metadata.return_value = compute.NotificationEndpoint(), metadata client.get( request, @@ -2662,6 +2722,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -2879,10 +2940,14 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionNotificationEndpointsRestInterceptor, + "post_insert_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionNotificationEndpointRequest.pb( compute.InsertRegionNotificationEndpointRequest() ) @@ -2906,6 +2971,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -2917,6 +2983,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -3007,10 +3074,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionNotificationEndpointsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionNotificationEndpointsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionNotificationEndpointsRequest.pb( compute.ListRegionNotificationEndpointsRequest() ) @@ -3036,6 +3106,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NotificationEndpointList() + post_with_metadata.return_value = compute.NotificationEndpointList(), metadata client.list( request, @@ -3047,6 +3118,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_region_operations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_operations.py index 4860f6b57518..65390025d06c 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_operations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_operations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 +320,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 = RegionOperationsClient(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 = RegionOperationsClient(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", [ @@ -1946,10 +1996,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionOperationsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionOperationsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionOperationsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionOperationRequest.pb( compute.DeleteRegionOperationRequest() ) @@ -1975,6 +2028,10 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DeleteRegionOperationResponse() + post_with_metadata.return_value = ( + compute.DeleteRegionOperationResponse(), + metadata, + ) client.delete( request, @@ -1986,6 +2043,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionOperationRequest): @@ -2110,10 +2168,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionOperationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionOperationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionOperationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionOperationRequest.pb( compute.GetRegionOperationRequest() ) @@ -2137,6 +2198,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.get( request, @@ -2148,6 +2210,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionOperationsRequest): @@ -2236,10 +2299,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionOperationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionOperationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionOperationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionOperationsRequest.pb( compute.ListRegionOperationsRequest() ) @@ -2263,6 +2329,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.OperationList() + post_with_metadata.return_value = compute.OperationList(), metadata client.list( request, @@ -2274,6 +2341,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_wait_rest_bad_request(request_type=compute.WaitRegionOperationRequest): @@ -2398,10 +2466,13 @@ def test_wait_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionOperationsRestInterceptor, "post_wait" ) as post, mock.patch.object( + transports.RegionOperationsRestInterceptor, "post_wait_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionOperationsRestInterceptor, "pre_wait" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.WaitRegionOperationRequest.pb( compute.WaitRegionOperationRequest() ) @@ -2425,6 +2496,7 @@ def test_wait_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.wait( request, @@ -2436,6 +2508,7 @@ def test_wait_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-compute/tests/unit/gapic/compute_v1/test_region_security_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_security_policies.py index 5ea251fdb37f..f9cf72798403 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_security_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_security_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionSecurityPoliciesClient(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 = RegionSecurityPoliciesClient(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", [ @@ -5082,10 +5132,13 @@ def test_add_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_add_rule" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_add_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_add_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddRuleRegionSecurityPolicyRequest.pb( compute.AddRuleRegionSecurityPolicyRequest() ) @@ -5109,6 +5162,7 @@ def test_add_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_rule( request, @@ -5120,6 +5174,7 @@ def test_add_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request( @@ -5254,10 +5309,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionSecurityPolicyRequest.pb( compute.DeleteRegionSecurityPolicyRequest() ) @@ -5281,6 +5339,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5292,6 +5351,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionSecurityPolicyRequest): @@ -5400,10 +5460,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionSecurityPolicyRequest.pb( compute.GetRegionSecurityPolicyRequest() ) @@ -5427,6 +5490,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicy() + post_with_metadata.return_value = compute.SecurityPolicy(), metadata client.get( request, @@ -5438,6 +5502,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rule_rest_bad_request( @@ -5538,10 +5603,13 @@ def test_get_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_get_rule" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_get_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_get_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRuleRegionSecurityPolicyRequest.pb( compute.GetRuleRegionSecurityPolicyRequest() ) @@ -5565,6 +5633,7 @@ def test_get_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicyRule() + post_with_metadata.return_value = compute.SecurityPolicyRule(), metadata client.get_rule( request, @@ -5576,6 +5645,7 @@ def test_get_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -5935,10 +6005,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionSecurityPolicyRequest.pb( compute.InsertRegionSecurityPolicyRequest() ) @@ -5962,6 +6035,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5973,6 +6047,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionSecurityPoliciesRequest): @@ -6059,10 +6134,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionSecurityPoliciesRequest.pb( compute.ListRegionSecurityPoliciesRequest() ) @@ -6086,6 +6164,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicyList() + post_with_metadata.return_value = compute.SecurityPolicyList(), metadata client.list( request, @@ -6097,6 +6176,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionSecurityPolicyRequest): @@ -6462,10 +6542,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionSecurityPolicyRequest.pb( compute.PatchRegionSecurityPolicyRequest() ) @@ -6489,6 +6572,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6500,6 +6584,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rule_rest_bad_request( @@ -6797,10 +6882,14 @@ def test_patch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_patch_rule" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, + "post_patch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_patch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRuleRegionSecurityPolicyRequest.pb( compute.PatchRuleRegionSecurityPolicyRequest() ) @@ -6824,6 +6913,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_rule( request, @@ -6835,6 +6925,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_rule_rest_bad_request( @@ -6969,10 +7060,14 @@ def test_remove_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_remove_rule" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, + "post_remove_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_remove_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveRuleRegionSecurityPolicyRequest.pb( compute.RemoveRuleRegionSecurityPolicyRequest() ) @@ -6996,6 +7091,7 @@ def test_remove_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_rule( request, @@ -7007,6 +7103,7 @@ def test_remove_rule_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( @@ -7212,10 +7309,14 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.RegionSecurityPoliciesRestInterceptor, + "post_set_labels_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionSecurityPoliciesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsRegionSecurityPolicyRequest.pb( compute.SetLabelsRegionSecurityPolicyRequest() ) @@ -7239,6 +7340,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -7250,6 +7352,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_certificates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_certificates.py index 75098aa5ddc2..30ca05af0e08 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_certificates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_certificates.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionSslCertificatesClient(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 = RegionSslCertificatesClient(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", [ @@ -2462,10 +2512,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionSslCertificatesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionSslCertificateRequest.pb( compute.DeleteRegionSslCertificateRequest() ) @@ -2489,6 +2542,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2500,6 +2554,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionSslCertificateRequest): @@ -2612,10 +2667,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionSslCertificatesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionSslCertificateRequest.pb( compute.GetRegionSslCertificateRequest() ) @@ -2639,6 +2697,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslCertificate() + post_with_metadata.return_value = compute.SslCertificate(), metadata client.get( request, @@ -2650,6 +2709,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -2873,10 +2933,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionSslCertificatesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionSslCertificateRequest.pb( compute.InsertRegionSslCertificateRequest() ) @@ -2900,6 +2963,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -2911,6 +2975,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionSslCertificatesRequest): @@ -2999,10 +3064,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionSslCertificatesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslCertificatesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionSslCertificatesRequest.pb( compute.ListRegionSslCertificatesRequest() ) @@ -3026,6 +3094,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslCertificateList() + post_with_metadata.return_value = compute.SslCertificateList(), metadata client.list( request, @@ -3037,6 +3106,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_region_ssl_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_policies.py index 11b1a2056765..7e424cee83c6 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_ssl_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = RegionSslPoliciesClient(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 = RegionSslPoliciesClient(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", [ @@ -3079,10 +3129,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionSslPolicyRequest.pb( compute.DeleteRegionSslPolicyRequest() ) @@ -3106,6 +3159,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3117,6 +3171,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionSslPolicyRequest): @@ -3221,10 +3276,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionSslPolicyRequest.pb( compute.GetRegionSslPolicyRequest() ) @@ -3248,6 +3306,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPolicy() + post_with_metadata.return_value = compute.SslPolicy(), metadata client.get( request, @@ -3259,6 +3318,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRegionSslPolicyRequest): @@ -3471,10 +3531,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionSslPolicyRequest.pb( compute.InsertRegionSslPolicyRequest() ) @@ -3498,6 +3561,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3509,6 +3573,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionSslPoliciesRequest): @@ -3597,10 +3662,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionSslPoliciesRequest.pb( compute.ListRegionSslPoliciesRequest() ) @@ -3624,6 +3692,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPoliciesList() + post_with_metadata.return_value = compute.SslPoliciesList(), metadata client.list( request, @@ -3635,6 +3704,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_available_features_rest_bad_request( @@ -3719,10 +3789,14 @@ def test_list_available_features_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_list_available_features" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, + "post_list_available_features_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_list_available_features" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAvailableFeaturesRegionSslPoliciesRequest.pb( compute.ListAvailableFeaturesRegionSslPoliciesRequest() ) @@ -3748,6 +3822,10 @@ def test_list_available_features_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPoliciesListAvailableFeaturesResponse() + post_with_metadata.return_value = ( + compute.SslPoliciesListAvailableFeaturesResponse(), + metadata, + ) client.list_available_features( request, @@ -3759,6 +3837,7 @@ def test_list_available_features_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionSslPolicyRequest): @@ -3971,10 +4050,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionSslPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionSslPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionSslPolicyRequest.pb( compute.PatchRegionSslPolicyRequest() ) @@ -3998,6 +4080,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4009,6 +4092,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_region_target_http_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_http_proxies.py index e81cc1f8f8ae..2ce2a3f638b5 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_http_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_http_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionTargetHttpProxiesClient(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 = RegionTargetHttpProxiesClient(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", [ @@ -2890,10 +2940,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionTargetHttpProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionTargetHttpProxyRequest.pb( compute.DeleteRegionTargetHttpProxyRequest() ) @@ -2917,6 +2970,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2928,6 +2982,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionTargetHttpProxyRequest): @@ -3038,10 +3093,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionTargetHttpProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionTargetHttpProxyRequest.pb( compute.GetRegionTargetHttpProxyRequest() ) @@ -3065,6 +3123,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpProxy() + post_with_metadata.return_value = compute.TargetHttpProxy(), metadata client.get( request, @@ -3076,6 +3135,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -3288,10 +3348,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionTargetHttpProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionTargetHttpProxyRequest.pb( compute.InsertRegionTargetHttpProxyRequest() ) @@ -3315,6 +3378,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3326,6 +3390,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionTargetHttpProxiesRequest): @@ -3414,10 +3479,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionTargetHttpProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionTargetHttpProxiesRequest.pb( compute.ListRegionTargetHttpProxiesRequest() ) @@ -3443,6 +3511,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpProxyList() + post_with_metadata.return_value = compute.TargetHttpProxyList(), metadata client.list( request, @@ -3454,6 +3523,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_url_map_rest_bad_request( @@ -3662,10 +3732,14 @@ def test_set_url_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "post_set_url_map" ) as post, mock.patch.object( + transports.RegionTargetHttpProxiesRestInterceptor, + "post_set_url_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpProxiesRestInterceptor, "pre_set_url_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetUrlMapRegionTargetHttpProxyRequest.pb( compute.SetUrlMapRegionTargetHttpProxyRequest() ) @@ -3689,6 +3763,7 @@ def test_set_url_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_url_map( request, @@ -3700,6 +3775,7 @@ def test_set_url_map_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-compute/tests/unit/gapic/compute_v1/test_region_target_https_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_https_proxies.py index 22815fda5a23..b0c292053b7f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_https_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_https_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionTargetHttpsProxiesClient(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 = RegionTargetHttpsProxiesClient(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", [ @@ -3772,10 +3822,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionTargetHttpsProxyRequest.pb( compute.DeleteRegionTargetHttpsProxyRequest() ) @@ -3799,6 +3852,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3810,6 +3864,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionTargetHttpsProxyRequest): @@ -3934,10 +3989,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionTargetHttpsProxyRequest.pb( compute.GetRegionTargetHttpsProxyRequest() ) @@ -3961,6 +4019,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpsProxy() + post_with_metadata.return_value = compute.TargetHttpsProxy(), metadata client.get( request, @@ -3972,6 +4031,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -4191,10 +4251,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionTargetHttpsProxyRequest.pb( compute.InsertRegionTargetHttpsProxyRequest() ) @@ -4218,6 +4281,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4229,6 +4293,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request( @@ -4319,10 +4384,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionTargetHttpsProxiesRequest.pb( compute.ListRegionTargetHttpsProxiesRequest() ) @@ -4348,6 +4416,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpsProxyList() + post_with_metadata.return_value = compute.TargetHttpsProxyList(), metadata client.list( request, @@ -4359,6 +4428,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request( @@ -4586,10 +4656,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionTargetHttpsProxyRequest.pb( compute.PatchRegionTargetHttpsProxyRequest() ) @@ -4613,6 +4686,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4624,6 +4698,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_ssl_certificates_rest_bad_request( @@ -4843,10 +4918,14 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_set_ssl_certificates" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, + "post_set_ssl_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_set_ssl_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSslCertificatesRegionTargetHttpsProxyRequest.pb( compute.SetSslCertificatesRegionTargetHttpsProxyRequest() ) @@ -4870,6 +4949,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_ssl_certificates( request, @@ -4881,6 +4961,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_url_map_rest_bad_request( @@ -5089,10 +5170,14 @@ def test_set_url_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "post_set_url_map" ) as post, mock.patch.object( + transports.RegionTargetHttpsProxiesRestInterceptor, + "post_set_url_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegionTargetHttpsProxiesRestInterceptor, "pre_set_url_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetUrlMapRegionTargetHttpsProxyRequest.pb( compute.SetUrlMapRegionTargetHttpsProxyRequest() ) @@ -5116,6 +5201,7 @@ def test_set_url_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_url_map( request, @@ -5127,6 +5213,7 @@ def test_set_url_map_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-compute/tests/unit/gapic/compute_v1/test_region_target_tcp_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_tcp_proxies.py index 56de523ac378..f0d5e971a983 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_tcp_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_target_tcp_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = RegionTargetTcpProxiesClient(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 = RegionTargetTcpProxiesClient(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", [ @@ -2464,10 +2514,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionTargetTcpProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionTargetTcpProxyRequest.pb( compute.DeleteRegionTargetTcpProxyRequest() ) @@ -2491,6 +2544,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2502,6 +2556,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionTargetTcpProxyRequest): @@ -2610,10 +2665,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionTargetTcpProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionTargetTcpProxyRequest.pb( compute.GetRegionTargetTcpProxyRequest() ) @@ -2637,6 +2695,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetTcpProxy() + post_with_metadata.return_value = compute.TargetTcpProxy(), metadata client.get( request, @@ -2648,6 +2707,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request( @@ -2859,10 +2919,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionTargetTcpProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionTargetTcpProxyRequest.pb( compute.InsertRegionTargetTcpProxyRequest() ) @@ -2886,6 +2949,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -2897,6 +2961,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionTargetTcpProxiesRequest): @@ -2985,10 +3050,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionTargetTcpProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionTargetTcpProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionTargetTcpProxiesRequest.pb( compute.ListRegionTargetTcpProxiesRequest() ) @@ -3012,6 +3080,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetTcpProxyList() + post_with_metadata.return_value = compute.TargetTcpProxyList(), metadata client.list( request, @@ -3023,6 +3092,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_region_url_maps.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_url_maps.py index 9f478dfa904d..f89915d1860f 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_url_maps.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_url_maps.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -315,6 +322,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 = RegionUrlMapsClient(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 = RegionUrlMapsClient(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", [ @@ -3473,10 +3523,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRegionUrlMapRequest.pb( compute.DeleteRegionUrlMapRequest() ) @@ -3500,6 +3553,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3511,6 +3565,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRegionUrlMapRequest): @@ -3609,10 +3664,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionUrlMapRequest.pb(compute.GetRegionUrlMapRequest()) transcode.return_value = { "method": "post", @@ -3634,6 +3692,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMap() + post_with_metadata.return_value = compute.UrlMap(), metadata client.get( request, @@ -3645,6 +3704,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRegionUrlMapRequest): @@ -4023,10 +4083,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRegionUrlMapRequest.pb( compute.InsertRegionUrlMapRequest() ) @@ -4050,6 +4113,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4061,6 +4125,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionUrlMapsRequest): @@ -4149,10 +4214,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionUrlMapsRequest.pb( compute.ListRegionUrlMapsRequest() ) @@ -4176,6 +4244,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMapList() + post_with_metadata.return_value = compute.UrlMapList(), metadata client.list( request, @@ -4187,6 +4256,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRegionUrlMapRequest): @@ -4565,10 +4635,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRegionUrlMapRequest.pb( compute.PatchRegionUrlMapRequest() ) @@ -4592,6 +4665,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4603,6 +4677,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateRegionUrlMapRequest): @@ -4981,10 +5056,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRegionUrlMapRequest.pb( compute.UpdateRegionUrlMapRequest() ) @@ -5008,6 +5086,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -5019,6 +5098,7 @@ def test_update_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_validate_rest_bad_request(request_type=compute.ValidateRegionUrlMapRequest): @@ -5370,10 +5450,13 @@ def test_validate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "post_validate" ) as post, mock.patch.object( + transports.RegionUrlMapsRestInterceptor, "post_validate_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionUrlMapsRestInterceptor, "pre_validate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ValidateRegionUrlMapRequest.pb( compute.ValidateRegionUrlMapRequest() ) @@ -5399,6 +5482,7 @@ def test_validate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMapsValidateResponse() + post_with_metadata.return_value = compute.UrlMapsValidateResponse(), metadata client.validate( request, @@ -5410,6 +5494,7 @@ def test_validate_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-compute/tests/unit/gapic/compute_v1/test_region_zones.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_zones.py index bd45824b687a..44ce18b01327 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_zones.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_region_zones.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -293,6 +300,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 = RegionZonesClient(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 = RegionZonesClient(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", [ @@ -1311,10 +1361,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionZonesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionZonesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionZonesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionZonesRequest.pb(compute.ListRegionZonesRequest()) transcode.return_value = { "method": "post", @@ -1336,6 +1389,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ZoneList() + post_with_metadata.return_value = compute.ZoneList(), metadata client.list( request, @@ -1347,6 +1401,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_regions.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_regions.py index 8ca019192b86..3f7292e5242d 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_regions.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_regions.py @@ -55,6 +55,13 @@ from google.cloud.compute_v1.services.regions import RegionsClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -273,6 +280,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = RegionsClient(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 = RegionsClient(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", [ @@ -1472,10 +1522,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RegionsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRegionRequest.pb(compute.GetRegionRequest()) transcode.return_value = { "method": "post", @@ -1497,6 +1550,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Region() + post_with_metadata.return_value = compute.Region(), metadata client.get( request, @@ -1508,6 +1562,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRegionsRequest): @@ -1594,10 +1649,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegionsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RegionsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegionsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRegionsRequest.pb(compute.ListRegionsRequest()) transcode.return_value = { "method": "post", @@ -1619,6 +1677,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RegionList() + post_with_metadata.return_value = compute.RegionList(), metadata client.list( request, @@ -1630,6 +1689,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_reservations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_reservations.py index a46d872f9272..d6bef130dd07 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_reservations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_reservations.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = ReservationsClient(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 = ReservationsClient(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", [ @@ -4212,10 +4262,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListReservationsRequest.pb( compute.AggregatedListReservationsRequest() ) @@ -4241,6 +4294,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ReservationAggregatedList() + post_with_metadata.return_value = compute.ReservationAggregatedList(), metadata client.aggregated_list( request, @@ -4252,6 +4306,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteReservationRequest): @@ -4376,10 +4431,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteReservationRequest.pb( compute.DeleteReservationRequest() ) @@ -4403,6 +4461,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4414,6 +4473,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetReservationRequest): @@ -4516,10 +4576,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetReservationRequest.pb(compute.GetReservationRequest()) transcode.return_value = { "method": "post", @@ -4541,6 +4604,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Reservation() + post_with_metadata.return_value = compute.Reservation(), metadata client.get( request, @@ -4552,6 +4616,7 @@ def test_get_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( @@ -4640,10 +4705,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyReservationRequest.pb( compute.GetIamPolicyReservationRequest() ) @@ -4667,6 +4735,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4678,6 +4747,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_insert_rest_bad_request(request_type=compute.InsertReservationRequest): @@ -4922,10 +4992,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertReservationRequest.pb( compute.InsertReservationRequest() ) @@ -4949,6 +5022,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4960,6 +5034,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListReservationsRequest): @@ -5048,10 +5123,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListReservationsRequest.pb( compute.ListReservationsRequest() ) @@ -5075,6 +5153,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ReservationList() + post_with_metadata.return_value = compute.ReservationList(), metadata client.list( request, @@ -5086,6 +5165,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resize_rest_bad_request(request_type=compute.ResizeReservationRequest): @@ -5288,10 +5368,13 @@ def test_resize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_resize" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_resize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_resize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ResizeReservationRequest.pb( compute.ResizeReservationRequest() ) @@ -5315,6 +5398,7 @@ def test_resize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.resize( request, @@ -5326,6 +5410,7 @@ def test_resize_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( @@ -5530,10 +5615,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyReservationRequest.pb( compute.SetIamPolicyReservationRequest() ) @@ -5557,6 +5645,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5568,6 +5657,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( @@ -5730,10 +5820,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsReservationRequest.pb( compute.TestIamPermissionsReservationRequest() ) @@ -5759,6 +5853,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5770,6 +5865,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_update_rest_bad_request(request_type=compute.UpdateReservationRequest): @@ -6014,10 +6110,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ReservationsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.ReservationsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ReservationsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateReservationRequest.pb( compute.UpdateReservationRequest() ) @@ -6041,6 +6140,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -6052,6 +6152,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_resource_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_resource_policies.py index c4136e611dbc..a5cff380a629 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_resource_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_resource_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = ResourcePoliciesClient(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 = ResourcePoliciesClient(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", [ @@ -3753,10 +3803,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListResourcePoliciesRequest.pb( compute.AggregatedListResourcePoliciesRequest() ) @@ -3782,6 +3835,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ResourcePolicyAggregatedList() + post_with_metadata.return_value = ( + compute.ResourcePolicyAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3793,6 +3850,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteResourcePolicyRequest): @@ -3925,10 +3983,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteResourcePolicyRequest.pb( compute.DeleteResourcePolicyRequest() ) @@ -3952,6 +4013,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3963,6 +4025,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetResourcePolicyRequest): @@ -4067,10 +4130,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetResourcePolicyRequest.pb( compute.GetResourcePolicyRequest() ) @@ -4094,6 +4160,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ResourcePolicy() + post_with_metadata.return_value = compute.ResourcePolicy(), metadata client.get( request, @@ -4105,6 +4172,7 @@ def test_get_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( @@ -4193,10 +4261,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyResourcePolicyRequest.pb( compute.GetIamPolicyResourcePolicyRequest() ) @@ -4220,6 +4291,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4231,6 +4303,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_insert_rest_bad_request(request_type=compute.InsertResourcePolicyRequest): @@ -4491,10 +4564,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertResourcePolicyRequest.pb( compute.InsertResourcePolicyRequest() ) @@ -4518,6 +4594,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4529,6 +4606,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListResourcePoliciesRequest): @@ -4619,10 +4697,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListResourcePoliciesRequest.pb( compute.ListResourcePoliciesRequest() ) @@ -4646,6 +4727,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ResourcePolicyList() + post_with_metadata.return_value = compute.ResourcePolicyList(), metadata client.list( request, @@ -4657,6 +4739,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchResourcePolicyRequest): @@ -4925,10 +5008,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchResourcePolicyRequest.pb( compute.PatchResourcePolicyRequest() ) @@ -4952,6 +5038,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4963,6 +5050,7 @@ def test_patch_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( @@ -5167,10 +5255,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyResourcePolicyRequest.pb( compute.SetIamPolicyResourcePolicyRequest() ) @@ -5194,6 +5285,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5205,6 +5297,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( @@ -5367,10 +5460,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ResourcePoliciesRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ResourcePoliciesRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsResourcePolicyRequest.pb( compute.TestIamPermissionsResourcePolicyRequest() ) @@ -5396,6 +5493,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5407,6 +5505,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py index 9655b229f31f..c1fbdf8e0923 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routers.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.routers import RoutersClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -280,6 +287,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 = RoutersClient(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 = RoutersClient(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", [ @@ -4363,10 +4413,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListRoutersRequest.pb( compute.AggregatedListRoutersRequest() ) @@ -4392,6 +4445,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RouterAggregatedList() + post_with_metadata.return_value = compute.RouterAggregatedList(), metadata client.aggregated_list( request, @@ -4403,6 +4457,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteRouterRequest): @@ -4525,10 +4580,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRouterRequest.pb(compute.DeleteRouterRequest()) transcode.return_value = { "method": "post", @@ -4550,6 +4608,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4561,6 +4620,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRouterRequest): @@ -4657,10 +4717,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRouterRequest.pb(compute.GetRouterRequest()) transcode.return_value = { "method": "post", @@ -4682,6 +4745,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Router() + post_with_metadata.return_value = compute.Router(), metadata client.get( request, @@ -4693,6 +4757,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_nat_ip_info_rest_bad_request( @@ -4772,10 +4837,13 @@ def test_get_nat_ip_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_get_nat_ip_info" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_get_nat_ip_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_get_nat_ip_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNatIpInfoRouterRequest.pb( compute.GetNatIpInfoRouterRequest() ) @@ -4799,6 +4867,7 @@ def test_get_nat_ip_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.NatIpInfoResponse() + post_with_metadata.return_value = compute.NatIpInfoResponse(), metadata client.get_nat_ip_info( request, @@ -4810,6 +4879,7 @@ def test_get_nat_ip_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_nat_mapping_info_rest_bad_request( @@ -4898,10 +4968,13 @@ def test_get_nat_mapping_info_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_get_nat_mapping_info" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_get_nat_mapping_info_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_get_nat_mapping_info" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetNatMappingInfoRoutersRequest.pb( compute.GetNatMappingInfoRoutersRequest() ) @@ -4927,6 +5000,7 @@ def test_get_nat_mapping_info_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VmEndpointNatMappingsList() + post_with_metadata.return_value = compute.VmEndpointNatMappingsList(), metadata client.get_nat_mapping_info( request, @@ -4938,6 +5012,7 @@ def test_get_nat_mapping_info_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_router_status_rest_bad_request( @@ -5020,10 +5095,13 @@ def test_get_router_status_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_get_router_status" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_get_router_status_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_get_router_status" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRouterStatusRouterRequest.pb( compute.GetRouterStatusRouterRequest() ) @@ -5049,6 +5127,7 @@ def test_get_router_status_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RouterStatusResponse() + post_with_metadata.return_value = compute.RouterStatusResponse(), metadata client.get_router_status( request, @@ -5060,6 +5139,7 @@ def test_get_router_status_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRouterRequest): @@ -5383,10 +5463,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRouterRequest.pb(compute.InsertRouterRequest()) transcode.return_value = { "method": "post", @@ -5408,6 +5491,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5419,6 +5503,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRoutersRequest): @@ -5505,10 +5590,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRoutersRequest.pb(compute.ListRoutersRequest()) transcode.return_value = { "method": "post", @@ -5530,6 +5618,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RouterList() + post_with_metadata.return_value = compute.RouterList(), metadata client.list( request, @@ -5541,6 +5630,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchRouterRequest): @@ -5864,10 +5954,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRouterRequest.pb(compute.PatchRouterRequest()) transcode.return_value = { "method": "post", @@ -5889,6 +5982,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -5900,6 +5994,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_preview_rest_bad_request(request_type=compute.PreviewRouterRequest): @@ -6178,10 +6273,13 @@ def test_preview_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_preview" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_preview_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_preview" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PreviewRouterRequest.pb(compute.PreviewRouterRequest()) transcode.return_value = { "method": "post", @@ -6205,6 +6303,7 @@ def test_preview_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RoutersPreviewResponse() + post_with_metadata.return_value = compute.RoutersPreviewResponse(), metadata client.preview( request, @@ -6216,6 +6315,7 @@ def test_preview_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateRouterRequest): @@ -6539,10 +6639,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutersRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.RoutersRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutersRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateRouterRequest.pb(compute.UpdateRouterRequest()) transcode.return_value = { "method": "post", @@ -6564,6 +6667,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -6575,6 +6679,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_routes.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routes.py index c484a3fe491d..5370a90290db 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routes.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_routes.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.routes import RoutesClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -279,6 +286,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 = RoutesClient(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 = RoutesClient(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", [ @@ -2289,10 +2339,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.RoutesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteRouteRequest.pb(compute.DeleteRouteRequest()) transcode.return_value = { "method": "post", @@ -2314,6 +2367,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2325,6 +2379,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetRouteRequest): @@ -2449,10 +2504,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.RoutesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRouteRequest.pb(compute.GetRouteRequest()) transcode.return_value = { "method": "post", @@ -2474,6 +2532,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Route() + post_with_metadata.return_value = compute.Route(), metadata client.get( request, @@ -2485,6 +2544,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertRouteRequest): @@ -2709,10 +2769,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.RoutesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertRouteRequest.pb(compute.InsertRouteRequest()) transcode.return_value = { "method": "post", @@ -2734,6 +2797,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -2745,6 +2809,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListRoutesRequest): @@ -2831,10 +2896,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RoutesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.RoutesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RoutesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListRoutesRequest.pb(compute.ListRoutesRequest()) transcode.return_value = { "method": "post", @@ -2856,6 +2924,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.RouteList() + post_with_metadata.return_value = compute.RouteList(), metadata client.list( request, @@ -2867,6 +2936,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_security_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_security_policies.py index 1ae2fb7845a8..1b1394a5e15a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_security_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_security_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = SecurityPoliciesClient(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 = SecurityPoliciesClient(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", [ @@ -5349,10 +5399,13 @@ def test_add_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_add_rule" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_add_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_add_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddRuleSecurityPolicyRequest.pb( compute.AddRuleSecurityPolicyRequest() ) @@ -5376,6 +5429,7 @@ def test_add_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_rule( request, @@ -5387,6 +5441,7 @@ def test_add_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -5481,10 +5536,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListSecurityPoliciesRequest.pb( compute.AggregatedListSecurityPoliciesRequest() ) @@ -5510,6 +5568,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPoliciesAggregatedList() + post_with_metadata.return_value = ( + compute.SecurityPoliciesAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -5521,6 +5583,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteSecurityPolicyRequest): @@ -5645,10 +5708,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSecurityPolicyRequest.pb( compute.DeleteSecurityPolicyRequest() ) @@ -5672,6 +5738,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5683,6 +5750,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetSecurityPolicyRequest): @@ -5783,10 +5851,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSecurityPolicyRequest.pb( compute.GetSecurityPolicyRequest() ) @@ -5810,6 +5881,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicy() + post_with_metadata.return_value = compute.SecurityPolicy(), metadata client.get( request, @@ -5821,6 +5893,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rule_rest_bad_request(request_type=compute.GetRuleSecurityPolicyRequest): @@ -5911,10 +5984,13 @@ def test_get_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_get_rule" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_get_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_get_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetRuleSecurityPolicyRequest.pb( compute.GetRuleSecurityPolicyRequest() ) @@ -5938,6 +6014,7 @@ def test_get_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicyRule() + post_with_metadata.return_value = compute.SecurityPolicyRule(), metadata client.get_rule( request, @@ -5949,6 +6026,7 @@ def test_get_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertSecurityPolicyRequest): @@ -6306,10 +6384,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertSecurityPolicyRequest.pb( compute.InsertSecurityPolicyRequest() ) @@ -6333,6 +6414,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -6344,6 +6426,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListSecurityPoliciesRequest): @@ -6430,10 +6513,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListSecurityPoliciesRequest.pb( compute.ListSecurityPoliciesRequest() ) @@ -6457,6 +6543,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SecurityPolicyList() + post_with_metadata.return_value = compute.SecurityPolicyList(), metadata client.list( request, @@ -6468,6 +6555,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_preconfigured_expression_sets_rest_bad_request( @@ -6556,11 +6644,15 @@ def test_list_preconfigured_expression_sets_rest_interceptors(null_interceptor): transports.SecurityPoliciesRestInterceptor, "post_list_preconfigured_expression_sets", ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, + "post_list_preconfigured_expression_sets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_list_preconfigured_expression_sets", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListPreconfiguredExpressionSetsSecurityPoliciesRequest.pb( compute.ListPreconfiguredExpressionSetsSecurityPoliciesRequest() ) @@ -6590,6 +6682,10 @@ def test_list_preconfigured_expression_sets_rest_interceptors(null_interceptor): post.return_value = ( compute.SecurityPoliciesListPreconfiguredExpressionSetsResponse() ) + post_with_metadata.return_value = ( + compute.SecurityPoliciesListPreconfiguredExpressionSetsResponse(), + metadata, + ) client.list_preconfigured_expression_sets( request, @@ -6601,6 +6697,7 @@ def test_list_preconfigured_expression_sets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchSecurityPolicyRequest): @@ -6958,10 +7055,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchSecurityPolicyRequest.pb( compute.PatchSecurityPolicyRequest() ) @@ -6985,6 +7085,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6996,6 +7097,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rule_rest_bad_request( @@ -7285,10 +7387,13 @@ def test_patch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_patch_rule" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_patch_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_patch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchRuleSecurityPolicyRequest.pb( compute.PatchRuleSecurityPolicyRequest() ) @@ -7312,6 +7417,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch_rule( request, @@ -7323,6 +7429,7 @@ def test_patch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_rule_rest_bad_request( @@ -7449,10 +7556,13 @@ def test_remove_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_remove_rule" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_remove_rule_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_remove_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveRuleSecurityPolicyRequest.pb( compute.RemoveRuleSecurityPolicyRequest() ) @@ -7476,6 +7586,7 @@ def test_remove_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_rule( request, @@ -7487,6 +7598,7 @@ def test_remove_rule_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( @@ -7692,10 +7804,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.SecurityPoliciesRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityPoliciesRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsSecurityPolicyRequest.pb( compute.SetLabelsSecurityPolicyRequest() ) @@ -7719,6 +7834,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -7730,6 +7846,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py index 66580f6a94bf..072199045286 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_service_attachments.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -332,6 +339,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 = ServiceAttachmentsClient(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 = ServiceAttachmentsClient(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", [ @@ -3779,10 +3829,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListServiceAttachmentsRequest.pb( compute.AggregatedListServiceAttachmentsRequest() ) @@ -3808,6 +3862,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ServiceAttachmentAggregatedList() + post_with_metadata.return_value = ( + compute.ServiceAttachmentAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3819,6 +3877,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteServiceAttachmentRequest): @@ -3951,10 +4010,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteServiceAttachmentRequest.pb( compute.DeleteServiceAttachmentRequest() ) @@ -3978,6 +4040,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3989,6 +4052,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetServiceAttachmentRequest): @@ -4111,10 +4175,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetServiceAttachmentRequest.pb( compute.GetServiceAttachmentRequest() ) @@ -4138,6 +4205,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ServiceAttachment() + post_with_metadata.return_value = compute.ServiceAttachment(), metadata client.get( request, @@ -4149,6 +4217,7 @@ def test_get_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( @@ -4237,10 +4306,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyServiceAttachmentRequest.pb( compute.GetIamPolicyServiceAttachmentRequest() ) @@ -4264,6 +4337,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4275,6 +4349,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_insert_rest_bad_request(request_type=compute.InsertServiceAttachmentRequest): @@ -4511,10 +4586,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertServiceAttachmentRequest.pb( compute.InsertServiceAttachmentRequest() ) @@ -4538,6 +4616,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4549,6 +4628,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListServiceAttachmentsRequest): @@ -4637,10 +4717,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListServiceAttachmentsRequest.pb( compute.ListServiceAttachmentsRequest() ) @@ -4666,6 +4749,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ServiceAttachmentList() + post_with_metadata.return_value = compute.ServiceAttachmentList(), metadata client.list( request, @@ -4677,6 +4761,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchServiceAttachmentRequest): @@ -4921,10 +5006,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchServiceAttachmentRequest.pb( compute.PatchServiceAttachmentRequest() ) @@ -4948,6 +5036,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4959,6 +5048,7 @@ def test_patch_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( @@ -5163,10 +5253,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyServiceAttachmentRequest.pb( compute.SetIamPolicyServiceAttachmentRequest() ) @@ -5190,6 +5284,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5201,6 +5296,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( @@ -5363,10 +5459,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.ServiceAttachmentsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceAttachmentsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsServiceAttachmentRequest.pb( compute.TestIamPermissionsServiceAttachmentRequest() ) @@ -5392,6 +5492,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5403,6 +5504,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshot_settings_service.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshot_settings_service.py index 482dfcb21e99..dd68a7f69c63 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshot_settings_service.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshot_settings_service.py @@ -65,6 +65,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -335,6 +342,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SnapshotSettingsServiceClient(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 = SnapshotSettingsServiceClient(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", [ @@ -1722,10 +1772,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotSettingsServiceRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SnapshotSettingsServiceRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotSettingsServiceRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSnapshotSettingRequest.pb( compute.GetSnapshotSettingRequest() ) @@ -1749,6 +1802,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SnapshotSettings() + post_with_metadata.return_value = compute.SnapshotSettings(), metadata client.get( request, @@ -1760,6 +1814,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchSnapshotSettingRequest): @@ -1960,10 +2015,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotSettingsServiceRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.SnapshotSettingsServiceRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotSettingsServiceRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchSnapshotSettingRequest.pb( compute.PatchSnapshotSettingRequest() ) @@ -1987,6 +2045,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -1998,6 +2057,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_snapshots.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshots.py index 048d45a54940..4fd544b6e5c0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshots.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_snapshots.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -294,6 +301,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SnapshotsClient(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 = SnapshotsClient(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", [ @@ -3305,10 +3355,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSnapshotRequest.pb(compute.DeleteSnapshotRequest()) transcode.return_value = { "method": "post", @@ -3330,6 +3383,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3341,6 +3395,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetSnapshotRequest): @@ -3490,10 +3545,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSnapshotRequest.pb(compute.GetSnapshotRequest()) transcode.return_value = { "method": "post", @@ -3515,6 +3573,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Snapshot() + post_with_metadata.return_value = compute.Snapshot(), metadata client.get( request, @@ -3526,6 +3585,7 @@ def test_get_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( @@ -3612,10 +3672,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicySnapshotRequest.pb( compute.GetIamPolicySnapshotRequest() ) @@ -3639,6 +3702,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -3650,6 +3714,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_insert_rest_bad_request(request_type=compute.InsertSnapshotRequest): @@ -3883,10 +3948,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertSnapshotRequest.pb(compute.InsertSnapshotRequest()) transcode.return_value = { "method": "post", @@ -3908,6 +3976,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3919,6 +3988,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListSnapshotsRequest): @@ -4005,10 +4075,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListSnapshotsRequest.pb(compute.ListSnapshotsRequest()) transcode.return_value = { "method": "post", @@ -4030,6 +4103,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SnapshotList() + post_with_metadata.return_value = compute.SnapshotList(), metadata client.list( request, @@ -4041,6 +4115,7 @@ def test_list_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( @@ -4243,10 +4318,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicySnapshotRequest.pb( compute.SetIamPolicySnapshotRequest() ) @@ -4270,6 +4348,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -4281,6 +4360,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_set_labels_rest_bad_request(request_type=compute.SetLabelsSnapshotRequest): @@ -4482,10 +4562,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsSnapshotRequest.pb( compute.SetLabelsSnapshotRequest() ) @@ -4509,6 +4592,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4520,6 +4604,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_test_iam_permissions_rest_bad_request( @@ -4680,10 +4765,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SnapshotsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SnapshotsRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SnapshotsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsSnapshotRequest.pb( compute.TestIamPermissionsSnapshotRequest() ) @@ -4709,6 +4797,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4720,6 +4809,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_certificates.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_certificates.py index 2f034ad59580..0b007c57f41a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_certificates.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_certificates.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SslCertificatesClient(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 = SslCertificatesClient(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", [ @@ -2604,10 +2654,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslCertificatesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.SslCertificatesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslCertificatesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListSslCertificatesRequest.pb( compute.AggregatedListSslCertificatesRequest() ) @@ -2633,6 +2686,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslCertificateAggregatedList() + post_with_metadata.return_value = ( + compute.SslCertificateAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -2644,6 +2701,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteSslCertificateRequest): @@ -2768,10 +2826,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslCertificatesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.SslCertificatesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslCertificatesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSslCertificateRequest.pb( compute.DeleteSslCertificateRequest() ) @@ -2795,6 +2856,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2806,6 +2868,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetSslCertificateRequest): @@ -2910,10 +2973,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslCertificatesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SslCertificatesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslCertificatesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSslCertificateRequest.pb( compute.GetSslCertificateRequest() ) @@ -2937,6 +3003,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslCertificate() + post_with_metadata.return_value = compute.SslCertificate(), metadata client.get( request, @@ -2948,6 +3015,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertSslCertificateRequest): @@ -3169,10 +3237,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslCertificatesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.SslCertificatesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslCertificatesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertSslCertificateRequest.pb( compute.InsertSslCertificateRequest() ) @@ -3196,6 +3267,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3207,6 +3279,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListSslCertificatesRequest): @@ -3295,10 +3368,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslCertificatesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.SslCertificatesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslCertificatesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListSslCertificatesRequest.pb( compute.ListSslCertificatesRequest() ) @@ -3322,6 +3398,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslCertificateList() + post_with_metadata.return_value = compute.SslCertificateList(), metadata client.list( request, @@ -3333,6 +3410,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_ssl_policies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_policies.py index ce5a3c5f3cb3..18bc5412153e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_policies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_ssl_policies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SslPoliciesClient(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 = SslPoliciesClient(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", [ @@ -3179,10 +3229,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListSslPoliciesRequest.pb( compute.AggregatedListSslPoliciesRequest() ) @@ -3208,6 +3261,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPoliciesAggregatedList() + post_with_metadata.return_value = compute.SslPoliciesAggregatedList(), metadata client.aggregated_list( request, @@ -3219,6 +3273,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteSslPolicyRequest): @@ -3343,10 +3398,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSslPolicyRequest.pb(compute.DeleteSslPolicyRequest()) transcode.return_value = { "method": "post", @@ -3368,6 +3426,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3379,6 +3438,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetSslPolicyRequest): @@ -3483,10 +3543,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSslPolicyRequest.pb(compute.GetSslPolicyRequest()) transcode.return_value = { "method": "post", @@ -3508,6 +3571,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPolicy() + post_with_metadata.return_value = compute.SslPolicy(), metadata client.get( request, @@ -3519,6 +3583,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertSslPolicyRequest): @@ -3731,10 +3796,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertSslPolicyRequest.pb(compute.InsertSslPolicyRequest()) transcode.return_value = { "method": "post", @@ -3756,6 +3824,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3767,6 +3836,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListSslPoliciesRequest): @@ -3855,10 +3925,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListSslPoliciesRequest.pb(compute.ListSslPoliciesRequest()) transcode.return_value = { "method": "post", @@ -3880,6 +3953,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPoliciesList() + post_with_metadata.return_value = compute.SslPoliciesList(), metadata client.list( request, @@ -3891,6 +3965,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_available_features_rest_bad_request( @@ -3975,10 +4050,14 @@ def test_list_available_features_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_list_available_features" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, + "post_list_available_features_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_list_available_features" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListAvailableFeaturesSslPoliciesRequest.pb( compute.ListAvailableFeaturesSslPoliciesRequest() ) @@ -4004,6 +4083,10 @@ def test_list_available_features_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SslPoliciesListAvailableFeaturesResponse() + post_with_metadata.return_value = ( + compute.SslPoliciesListAvailableFeaturesResponse(), + metadata, + ) client.list_available_features( request, @@ -4015,6 +4098,7 @@ def test_list_available_features_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchSslPolicyRequest): @@ -4227,10 +4311,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SslPoliciesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.SslPoliciesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SslPoliciesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchSslPolicyRequest.pb(compute.PatchSslPolicyRequest()) transcode.return_value = { "method": "post", @@ -4252,6 +4339,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4263,6 +4351,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_storage_pool_types.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pool_types.py index 3a3f952d398f..ca026ceba44d 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pool_types.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pool_types.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 +320,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 = StoragePoolTypesClient(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 = StoragePoolTypesClient(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", [ @@ -1833,10 +1883,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.StoragePoolTypesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListStoragePoolTypesRequest.pb( compute.AggregatedListStoragePoolTypesRequest() ) @@ -1862,6 +1915,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolTypeAggregatedList() + post_with_metadata.return_value = ( + compute.StoragePoolTypeAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -1873,6 +1930,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetStoragePoolTypeRequest): @@ -1993,10 +2051,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.StoragePoolTypesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetStoragePoolTypeRequest.pb( compute.GetStoragePoolTypeRequest() ) @@ -2020,6 +2081,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolType() + post_with_metadata.return_value = compute.StoragePoolType(), metadata client.get( request, @@ -2031,6 +2093,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListStoragePoolTypesRequest): @@ -2119,10 +2182,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.StoragePoolTypesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolTypesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListStoragePoolTypesRequest.pb( compute.ListStoragePoolTypesRequest() ) @@ -2148,6 +2214,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolTypeList() + post_with_metadata.return_value = compute.StoragePoolTypeList(), metadata client.list( request, @@ -2159,6 +2226,7 @@ def test_list_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-compute/tests/unit/gapic/compute_v1/test_storage_pools.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pools.py index 90c5d62f6400..1dc0425ef083 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pools.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_storage_pools.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 = StoragePoolsClient(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 = StoragePoolsClient(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", [ @@ -4000,10 +4050,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListStoragePoolsRequest.pb( compute.AggregatedListStoragePoolsRequest() ) @@ -4029,6 +4082,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolAggregatedList() + post_with_metadata.return_value = compute.StoragePoolAggregatedList(), metadata client.aggregated_list( request, @@ -4040,6 +4094,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteStoragePoolRequest): @@ -4164,10 +4219,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteStoragePoolRequest.pb( compute.DeleteStoragePoolRequest() ) @@ -4191,6 +4249,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4202,6 +4261,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetStoragePoolRequest): @@ -4316,10 +4376,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetStoragePoolRequest.pb(compute.GetStoragePoolRequest()) transcode.return_value = { "method": "post", @@ -4341,6 +4404,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePool() + post_with_metadata.return_value = compute.StoragePool(), metadata client.get( request, @@ -4352,6 +4416,7 @@ def test_get_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( @@ -4440,10 +4505,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicyStoragePoolRequest.pb( compute.GetIamPolicyStoragePoolRequest() ) @@ -4467,6 +4535,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -4478,6 +4547,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_insert_rest_bad_request(request_type=compute.InsertStoragePoolRequest): @@ -4703,10 +4773,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertStoragePoolRequest.pb( compute.InsertStoragePoolRequest() ) @@ -4730,6 +4803,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4741,6 +4815,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListStoragePoolsRequest): @@ -4833,10 +4908,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListStoragePoolsRequest.pb( compute.ListStoragePoolsRequest() ) @@ -4860,6 +4938,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolList() + post_with_metadata.return_value = compute.StoragePoolList(), metadata client.list( request, @@ -4871,6 +4950,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_disks_rest_bad_request(request_type=compute.ListDisksStoragePoolsRequest): @@ -4963,10 +5043,13 @@ def test_list_disks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_list_disks" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_list_disks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_list_disks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListDisksStoragePoolsRequest.pb( compute.ListDisksStoragePoolsRequest() ) @@ -4992,6 +5075,7 @@ def test_list_disks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.StoragePoolListDisks() + post_with_metadata.return_value = compute.StoragePoolListDisks(), metadata client.list_disks( request, @@ -5003,6 +5087,7 @@ def test_list_disks_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( @@ -5207,10 +5292,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicyStoragePoolRequest.pb( compute.SetIamPolicyStoragePoolRequest() ) @@ -5234,6 +5322,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -5245,6 +5334,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( @@ -5407,10 +5497,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsStoragePoolRequest.pb( compute.TestIamPermissionsStoragePoolRequest() ) @@ -5436,6 +5530,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -5447,6 +5542,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_update_rest_bad_request(request_type=compute.UpdateStoragePoolRequest): @@ -5672,10 +5768,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StoragePoolsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.StoragePoolsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.StoragePoolsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateStoragePoolRequest.pb( compute.UpdateStoragePoolRequest() ) @@ -5699,6 +5798,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -5710,6 +5810,7 @@ def test_update_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-compute/tests/unit/gapic/compute_v1/test_subnetworks.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_subnetworks.py index ea238c7f0ab8..d834e0d55e97 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_subnetworks.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_subnetworks.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SubnetworksClient(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 = SubnetworksClient(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", [ @@ -4856,10 +4906,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListSubnetworksRequest.pb( compute.AggregatedListSubnetworksRequest() ) @@ -4885,6 +4938,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SubnetworkAggregatedList() + post_with_metadata.return_value = compute.SubnetworkAggregatedList(), metadata client.aggregated_list( request, @@ -4896,6 +4950,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteSubnetworkRequest): @@ -5020,10 +5075,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteSubnetworkRequest.pb( compute.DeleteSubnetworkRequest() ) @@ -5047,6 +5105,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5058,6 +5117,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_expand_ip_cidr_range_rest_bad_request( @@ -5269,10 +5329,13 @@ def test_expand_ip_cidr_range_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_expand_ip_cidr_range" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_expand_ip_cidr_range_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_expand_ip_cidr_range" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ExpandIpCidrRangeSubnetworkRequest.pb( compute.ExpandIpCidrRangeSubnetworkRequest() ) @@ -5296,6 +5359,7 @@ def test_expand_ip_cidr_range_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.expand_ip_cidr_range( request, @@ -5307,6 +5371,7 @@ def test_expand_ip_cidr_range_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetSubnetworkRequest): @@ -5433,10 +5498,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetSubnetworkRequest.pb(compute.GetSubnetworkRequest()) transcode.return_value = { "method": "post", @@ -5458,6 +5526,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Subnetwork() + post_with_metadata.return_value = compute.Subnetwork(), metadata client.get( request, @@ -5469,6 +5538,7 @@ def test_get_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( @@ -5557,10 +5627,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetIamPolicySubnetworkRequest.pb( compute.GetIamPolicySubnetworkRequest() ) @@ -5584,6 +5657,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.get_iam_policy( request, @@ -5595,6 +5669,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_insert_rest_bad_request(request_type=compute.InsertSubnetworkRequest): @@ -5826,10 +5901,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertSubnetworkRequest.pb( compute.InsertSubnetworkRequest() ) @@ -5853,6 +5931,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5864,6 +5943,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListSubnetworksRequest): @@ -5952,10 +6032,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListSubnetworksRequest.pb(compute.ListSubnetworksRequest()) transcode.return_value = { "method": "post", @@ -5977,6 +6060,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.SubnetworkList() + post_with_metadata.return_value = compute.SubnetworkList(), metadata client.list( request, @@ -5988,6 +6072,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_usable_rest_bad_request( @@ -6078,10 +6163,13 @@ def test_list_usable_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_list_usable" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_list_usable_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_list_usable" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListUsableSubnetworksRequest.pb( compute.ListUsableSubnetworksRequest() ) @@ -6107,6 +6195,10 @@ def test_list_usable_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UsableSubnetworksAggregatedList() + post_with_metadata.return_value = ( + compute.UsableSubnetworksAggregatedList(), + metadata, + ) client.list_usable( request, @@ -6118,6 +6210,7 @@ def test_list_usable_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchSubnetworkRequest): @@ -6349,10 +6442,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchSubnetworkRequest.pb(compute.PatchSubnetworkRequest()) transcode.return_value = { "method": "post", @@ -6374,6 +6470,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6385,6 +6482,7 @@ def test_patch_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( @@ -6589,10 +6687,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetIamPolicySubnetworkRequest.pb( compute.SetIamPolicySubnetworkRequest() ) @@ -6616,6 +6717,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Policy() + post_with_metadata.return_value = compute.Policy(), metadata client.set_iam_policy( request, @@ -6627,6 +6729,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_set_private_ip_google_access_rest_bad_request( @@ -6838,10 +6941,14 @@ def test_set_private_ip_google_access_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_set_private_ip_google_access" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, + "post_set_private_ip_google_access_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_set_private_ip_google_access" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetPrivateIpGoogleAccessSubnetworkRequest.pb( compute.SetPrivateIpGoogleAccessSubnetworkRequest() ) @@ -6865,6 +6972,7 @@ def test_set_private_ip_google_access_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_private_ip_google_access( request, @@ -6876,6 +6984,7 @@ def test_set_private_ip_google_access_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( @@ -7038,10 +7147,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SubnetworksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SubnetworksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SubnetworksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsSubnetworkRequest.pb( compute.TestIamPermissionsSubnetworkRequest() ) @@ -7067,6 +7179,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -7078,6 +7191,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_grpc_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_grpc_proxies.py index a4055203d20c..306946574cc0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_grpc_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_grpc_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = TargetGrpcProxiesClient(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 = TargetGrpcProxiesClient(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,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetGrpcProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetGrpcProxyRequest.pb( compute.DeleteTargetGrpcProxyRequest() ) @@ -2809,6 +2862,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -2820,6 +2874,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetGrpcProxyRequest): @@ -2920,10 +2975,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetGrpcProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetGrpcProxyRequest.pb( compute.GetTargetGrpcProxyRequest() ) @@ -2947,6 +3005,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetGrpcProxy() + post_with_metadata.return_value = compute.TargetGrpcProxy(), metadata client.get( request, @@ -2958,6 +3017,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetGrpcProxyRequest): @@ -3167,10 +3227,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetGrpcProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetGrpcProxyRequest.pb( compute.InsertTargetGrpcProxyRequest() ) @@ -3194,6 +3257,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3205,6 +3269,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetGrpcProxiesRequest): @@ -3293,10 +3358,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetGrpcProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetGrpcProxiesRequest.pb( compute.ListTargetGrpcProxiesRequest() ) @@ -3322,6 +3390,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetGrpcProxyList() + post_with_metadata.return_value = compute.TargetGrpcProxyList(), metadata client.list( request, @@ -3333,6 +3402,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchTargetGrpcProxyRequest): @@ -3542,10 +3612,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.TargetGrpcProxiesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetGrpcProxiesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchTargetGrpcProxyRequest.pb( compute.PatchTargetGrpcProxyRequest() ) @@ -3569,6 +3642,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -3580,6 +3654,7 @@ def test_patch_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-compute/tests/unit/gapic/compute_v1/test_target_http_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_http_proxies.py index d00ba47d47dc..f60be38f466e 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_http_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_http_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = TargetHttpProxiesClient(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 = TargetHttpProxiesClient(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", [ @@ -3432,10 +3482,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetHttpProxiesRequest.pb( compute.AggregatedListTargetHttpProxiesRequest() ) @@ -3461,6 +3515,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpProxyAggregatedList() + post_with_metadata.return_value = ( + compute.TargetHttpProxyAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3472,6 +3530,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetHttpProxyRequest): @@ -3596,10 +3655,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetHttpProxyRequest.pb( compute.DeleteTargetHttpProxyRequest() ) @@ -3623,6 +3685,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3634,6 +3697,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetHttpProxyRequest): @@ -3736,10 +3800,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetHttpProxyRequest.pb( compute.GetTargetHttpProxyRequest() ) @@ -3763,6 +3830,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpProxy() + post_with_metadata.return_value = compute.TargetHttpProxy(), metadata client.get( request, @@ -3774,6 +3842,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetHttpProxyRequest): @@ -3984,10 +4053,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetHttpProxyRequest.pb( compute.InsertTargetHttpProxyRequest() ) @@ -4011,6 +4083,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4022,6 +4095,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetHttpProxiesRequest): @@ -4110,10 +4184,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetHttpProxiesRequest.pb( compute.ListTargetHttpProxiesRequest() ) @@ -4139,6 +4216,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpProxyList() + post_with_metadata.return_value = compute.TargetHttpProxyList(), metadata client.list( request, @@ -4150,6 +4228,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchTargetHttpProxyRequest): @@ -4360,10 +4439,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchTargetHttpProxyRequest.pb( compute.PatchTargetHttpProxyRequest() ) @@ -4387,6 +4469,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -4398,6 +4481,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_url_map_rest_bad_request( @@ -4598,10 +4682,13 @@ def test_set_url_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "post_set_url_map" ) as post, mock.patch.object( + transports.TargetHttpProxiesRestInterceptor, "post_set_url_map_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpProxiesRestInterceptor, "pre_set_url_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetUrlMapTargetHttpProxyRequest.pb( compute.SetUrlMapTargetHttpProxyRequest() ) @@ -4625,6 +4712,7 @@ def test_set_url_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_url_map( request, @@ -4636,6 +4724,7 @@ def test_set_url_map_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-compute/tests/unit/gapic/compute_v1/test_target_https_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_https_proxies.py index 3337c4d9e2ec..bed1810f5b50 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_https_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_https_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -332,6 +339,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 = TargetHttpsProxiesClient(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 = TargetHttpsProxiesClient(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", [ @@ -5108,10 +5158,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetHttpsProxiesRequest.pb( compute.AggregatedListTargetHttpsProxiesRequest() ) @@ -5137,6 +5191,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpsProxyAggregatedList() + post_with_metadata.return_value = ( + compute.TargetHttpsProxyAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -5148,6 +5206,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetHttpsProxyRequest): @@ -5272,10 +5331,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetHttpsProxyRequest.pb( compute.DeleteTargetHttpsProxyRequest() ) @@ -5299,6 +5361,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -5310,6 +5373,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetHttpsProxyRequest): @@ -5426,10 +5490,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetHttpsProxyRequest.pb( compute.GetTargetHttpsProxyRequest() ) @@ -5453,6 +5520,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpsProxy() + post_with_metadata.return_value = compute.TargetHttpsProxy(), metadata client.get( request, @@ -5464,6 +5532,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetHttpsProxyRequest): @@ -5681,10 +5750,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetHttpsProxyRequest.pb( compute.InsertTargetHttpsProxyRequest() ) @@ -5708,6 +5780,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -5719,6 +5792,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetHttpsProxiesRequest): @@ -5807,10 +5881,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetHttpsProxiesRequest.pb( compute.ListTargetHttpsProxiesRequest() ) @@ -5836,6 +5913,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetHttpsProxyList() + post_with_metadata.return_value = compute.TargetHttpsProxyList(), metadata client.list( request, @@ -5847,6 +5925,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchTargetHttpsProxyRequest): @@ -6064,10 +6143,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchTargetHttpsProxyRequest.pb( compute.PatchTargetHttpsProxyRequest() ) @@ -6091,6 +6173,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -6102,6 +6185,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_certificate_map_rest_bad_request( @@ -6313,10 +6397,14 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_set_certificate_map" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, + "post_set_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_set_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetCertificateMapTargetHttpsProxyRequest.pb( compute.SetCertificateMapTargetHttpsProxyRequest() ) @@ -6340,6 +6428,7 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_certificate_map( request, @@ -6351,6 +6440,7 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_quic_override_rest_bad_request( @@ -6562,10 +6652,14 @@ def test_set_quic_override_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_set_quic_override" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, + "post_set_quic_override_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_set_quic_override" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetQuicOverrideTargetHttpsProxyRequest.pb( compute.SetQuicOverrideTargetHttpsProxyRequest() ) @@ -6589,6 +6683,7 @@ def test_set_quic_override_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_quic_override( request, @@ -6600,6 +6695,7 @@ def test_set_quic_override_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_ssl_certificates_rest_bad_request( @@ -6811,10 +6907,14 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_set_ssl_certificates" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, + "post_set_ssl_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_set_ssl_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSslCertificatesTargetHttpsProxyRequest.pb( compute.SetSslCertificatesTargetHttpsProxyRequest() ) @@ -6838,6 +6938,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_ssl_certificates( request, @@ -6849,6 +6950,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_ssl_policy_rest_bad_request( @@ -7051,10 +7153,14 @@ def test_set_ssl_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_set_ssl_policy" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, + "post_set_ssl_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_set_ssl_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSslPolicyTargetHttpsProxyRequest.pb( compute.SetSslPolicyTargetHttpsProxyRequest() ) @@ -7078,6 +7184,7 @@ def test_set_ssl_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_ssl_policy( request, @@ -7089,6 +7196,7 @@ def test_set_ssl_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_url_map_rest_bad_request( @@ -7289,10 +7397,13 @@ def test_set_url_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "post_set_url_map" ) as post, mock.patch.object( + transports.TargetHttpsProxiesRestInterceptor, "post_set_url_map_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetHttpsProxiesRestInterceptor, "pre_set_url_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetUrlMapTargetHttpsProxyRequest.pb( compute.SetUrlMapTargetHttpsProxyRequest() ) @@ -7316,6 +7427,7 @@ def test_set_url_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_url_map( request, @@ -7327,6 +7439,7 @@ def test_set_url_map_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-compute/tests/unit/gapic/compute_v1/test_target_instances.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py index d956e7f89b44..f16db0bbdf81 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_instances.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -319,6 +326,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TargetInstancesClient(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 = TargetInstancesClient(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", [ @@ -3104,10 +3154,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetInstancesRequest.pb( compute.AggregatedListTargetInstancesRequest() ) @@ -3133,6 +3186,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetInstanceAggregatedList() + post_with_metadata.return_value = ( + compute.TargetInstanceAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3144,6 +3201,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetInstanceRequest): @@ -3276,10 +3334,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetInstanceRequest.pb( compute.DeleteTargetInstanceRequest() ) @@ -3303,6 +3364,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3314,6 +3376,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetInstanceRequest): @@ -3424,10 +3487,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetInstanceRequest.pb( compute.GetTargetInstanceRequest() ) @@ -3451,6 +3517,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetInstance() + post_with_metadata.return_value = compute.TargetInstance(), metadata client.get( request, @@ -3462,6 +3529,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetInstanceRequest): @@ -3670,10 +3738,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetInstanceRequest.pb( compute.InsertTargetInstanceRequest() ) @@ -3697,6 +3768,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3708,6 +3780,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetInstancesRequest): @@ -3796,10 +3869,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetInstancesRequest.pb( compute.ListTargetInstancesRequest() ) @@ -3823,6 +3899,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetInstanceList() + post_with_metadata.return_value = compute.TargetInstanceList(), metadata client.list( request, @@ -3834,6 +3911,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_security_policy_rest_bad_request( @@ -4046,10 +4124,14 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetInstancesRestInterceptor, "post_set_security_policy" ) as post, mock.patch.object( + transports.TargetInstancesRestInterceptor, + "post_set_security_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetInstancesRestInterceptor, "pre_set_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSecurityPolicyTargetInstanceRequest.pb( compute.SetSecurityPolicyTargetInstanceRequest() ) @@ -4073,6 +4155,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_security_policy( request, @@ -4084,6 +4167,7 @@ def test_set_security_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-compute/tests/unit/gapic/compute_v1/test_target_pools.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py index e23ed1874e46..3250848a01a0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_pools.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TargetPoolsClient(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 = TargetPoolsClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ @@ -5599,10 +5649,13 @@ def test_add_health_check_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_add_health_check" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_add_health_check_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_add_health_check" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddHealthCheckTargetPoolRequest.pb( compute.AddHealthCheckTargetPoolRequest() ) @@ -5626,6 +5679,7 @@ def test_add_health_check_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_health_check( request, @@ -5637,6 +5691,7 @@ def test_add_health_check_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_instance_rest_bad_request( @@ -5848,10 +5903,13 @@ def test_add_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_add_instance" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_add_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_add_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AddInstanceTargetPoolRequest.pb( compute.AddInstanceTargetPoolRequest() ) @@ -5875,6 +5933,7 @@ def test_add_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.add_instance( request, @@ -5886,6 +5945,7 @@ def test_add_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_aggregated_list_rest_bad_request( @@ -5978,10 +6038,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetPoolsRequest.pb( compute.AggregatedListTargetPoolsRequest() ) @@ -6007,6 +6070,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetPoolAggregatedList() + post_with_metadata.return_value = compute.TargetPoolAggregatedList(), metadata client.aggregated_list( request, @@ -6018,6 +6082,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetPoolRequest): @@ -6142,10 +6207,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetPoolRequest.pb( compute.DeleteTargetPoolRequest() ) @@ -6169,6 +6237,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -6180,6 +6249,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetPoolRequest): @@ -6286,10 +6356,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetPoolRequest.pb(compute.GetTargetPoolRequest()) transcode.return_value = { "method": "post", @@ -6311,6 +6384,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetPool() + post_with_metadata.return_value = compute.TargetPool(), metadata client.get( request, @@ -6322,6 +6396,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_health_rest_bad_request(request_type=compute.GetHealthTargetPoolRequest): @@ -6478,10 +6553,13 @@ def test_get_health_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_get_health" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_get_health_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_get_health" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetHealthTargetPoolRequest.pb( compute.GetHealthTargetPoolRequest() ) @@ -6507,6 +6585,7 @@ def test_get_health_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetPoolInstanceHealth() + post_with_metadata.return_value = compute.TargetPoolInstanceHealth(), metadata client.get_health( request, @@ -6518,6 +6597,7 @@ def test_get_health_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetPoolRequest): @@ -6726,10 +6806,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetPoolRequest.pb( compute.InsertTargetPoolRequest() ) @@ -6753,6 +6836,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -6764,6 +6848,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetPoolsRequest): @@ -6852,10 +6937,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetPoolsRequest.pb(compute.ListTargetPoolsRequest()) transcode.return_value = { "method": "post", @@ -6877,6 +6965,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetPoolList() + post_with_metadata.return_value = compute.TargetPoolList(), metadata client.list( request, @@ -6888,6 +6977,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_health_check_rest_bad_request( @@ -7099,10 +7189,13 @@ def test_remove_health_check_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_remove_health_check" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_remove_health_check_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_remove_health_check" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveHealthCheckTargetPoolRequest.pb( compute.RemoveHealthCheckTargetPoolRequest() ) @@ -7126,6 +7219,7 @@ def test_remove_health_check_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_health_check( request, @@ -7137,6 +7231,7 @@ def test_remove_health_check_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_instance_rest_bad_request( @@ -7348,10 +7443,13 @@ def test_remove_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_remove_instance" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_remove_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_remove_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.RemoveInstanceTargetPoolRequest.pb( compute.RemoveInstanceTargetPoolRequest() ) @@ -7375,6 +7473,7 @@ def test_remove_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.remove_instance( request, @@ -7386,6 +7485,7 @@ def test_remove_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_backup_rest_bad_request(request_type=compute.SetBackupTargetPoolRequest): @@ -7584,10 +7684,13 @@ def test_set_backup_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_set_backup" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_set_backup_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_set_backup" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetBackupTargetPoolRequest.pb( compute.SetBackupTargetPoolRequest() ) @@ -7611,6 +7714,7 @@ def test_set_backup_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_backup( request, @@ -7622,6 +7726,7 @@ def test_set_backup_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_security_policy_rest_bad_request( @@ -7826,10 +7931,13 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetPoolsRestInterceptor, "post_set_security_policy" ) as post, mock.patch.object( + transports.TargetPoolsRestInterceptor, "post_set_security_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetPoolsRestInterceptor, "pre_set_security_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSecurityPolicyTargetPoolRequest.pb( compute.SetSecurityPolicyTargetPoolRequest() ) @@ -7853,6 +7961,7 @@ def test_set_security_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_security_policy( request, @@ -7864,6 +7973,7 @@ def test_set_security_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-compute/tests/unit/gapic/compute_v1/test_target_ssl_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_ssl_proxies.py index 8c5e342be302..4b8c79970eff 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_ssl_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_ssl_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = TargetSslProxiesClient(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 = TargetSslProxiesClient(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", [ @@ -4452,10 +4502,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetSslProxyRequest.pb( compute.DeleteTargetSslProxyRequest() ) @@ -4479,6 +4532,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4490,6 +4544,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetSslProxyRequest): @@ -4592,10 +4647,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetSslProxyRequest.pb( compute.GetTargetSslProxyRequest() ) @@ -4619,6 +4677,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetSslProxy() + post_with_metadata.return_value = compute.TargetSslProxy(), metadata client.get( request, @@ -4630,6 +4689,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetSslProxyRequest): @@ -4840,10 +4900,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetSslProxyRequest.pb( compute.InsertTargetSslProxyRequest() ) @@ -4867,6 +4930,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4878,6 +4942,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetSslProxiesRequest): @@ -4966,10 +5031,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetSslProxiesRequest.pb( compute.ListTargetSslProxiesRequest() ) @@ -4993,6 +5061,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetSslProxyList() + post_with_metadata.return_value = compute.TargetSslProxyList(), metadata client.list( request, @@ -5004,6 +5073,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_backend_service_rest_bad_request( @@ -5215,10 +5285,14 @@ def test_set_backend_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_set_backend_service" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, + "post_set_backend_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_set_backend_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetBackendServiceTargetSslProxyRequest.pb( compute.SetBackendServiceTargetSslProxyRequest() ) @@ -5242,6 +5316,7 @@ def test_set_backend_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_backend_service( request, @@ -5253,6 +5328,7 @@ def test_set_backend_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_certificate_map_rest_bad_request( @@ -5464,10 +5540,14 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_set_certificate_map" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, + "post_set_certificate_map_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_set_certificate_map" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetCertificateMapTargetSslProxyRequest.pb( compute.SetCertificateMapTargetSslProxyRequest() ) @@ -5491,6 +5571,7 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_certificate_map( request, @@ -5502,6 +5583,7 @@ def test_set_certificate_map_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_proxy_header_rest_bad_request( @@ -5713,10 +5795,14 @@ def test_set_proxy_header_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_set_proxy_header" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, + "post_set_proxy_header_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_set_proxy_header" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetProxyHeaderTargetSslProxyRequest.pb( compute.SetProxyHeaderTargetSslProxyRequest() ) @@ -5740,6 +5826,7 @@ def test_set_proxy_header_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_proxy_header( request, @@ -5751,6 +5838,7 @@ def test_set_proxy_header_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_ssl_certificates_rest_bad_request( @@ -5962,10 +6050,14 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_set_ssl_certificates" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, + "post_set_ssl_certificates_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_set_ssl_certificates" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSslCertificatesTargetSslProxyRequest.pb( compute.SetSslCertificatesTargetSslProxyRequest() ) @@ -5989,6 +6081,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_ssl_certificates( request, @@ -6000,6 +6093,7 @@ def test_set_ssl_certificates_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_ssl_policy_rest_bad_request( @@ -6202,10 +6296,13 @@ def test_set_ssl_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "post_set_ssl_policy" ) as post, mock.patch.object( + transports.TargetSslProxiesRestInterceptor, "post_set_ssl_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetSslProxiesRestInterceptor, "pre_set_ssl_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetSslPolicyTargetSslProxyRequest.pb( compute.SetSslPolicyTargetSslProxyRequest() ) @@ -6229,6 +6326,7 @@ def test_set_ssl_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_ssl_policy( request, @@ -6240,6 +6338,7 @@ def test_set_ssl_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-compute/tests/unit/gapic/compute_v1/test_target_tcp_proxies.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_tcp_proxies.py index 13bddeb6f0a0..3ba0e831d99a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_tcp_proxies.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_tcp_proxies.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -320,6 +327,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 = TargetTcpProxiesClient(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 = TargetTcpProxiesClient(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", [ @@ -3446,10 +3496,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetTcpProxiesRequest.pb( compute.AggregatedListTargetTcpProxiesRequest() ) @@ -3475,6 +3528,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetTcpProxyAggregatedList() + post_with_metadata.return_value = ( + compute.TargetTcpProxyAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3486,6 +3543,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetTcpProxyRequest): @@ -3610,10 +3668,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetTcpProxyRequest.pb( compute.DeleteTargetTcpProxyRequest() ) @@ -3637,6 +3698,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3648,6 +3710,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetTcpProxyRequest): @@ -3748,10 +3811,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetTcpProxyRequest.pb( compute.GetTargetTcpProxyRequest() ) @@ -3775,6 +3841,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetTcpProxy() + post_with_metadata.return_value = compute.TargetTcpProxy(), metadata client.get( request, @@ -3786,6 +3853,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetTcpProxyRequest): @@ -3995,10 +4063,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetTcpProxyRequest.pb( compute.InsertTargetTcpProxyRequest() ) @@ -4022,6 +4093,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4033,6 +4105,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetTcpProxiesRequest): @@ -4121,10 +4194,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetTcpProxiesRequest.pb( compute.ListTargetTcpProxiesRequest() ) @@ -4148,6 +4224,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetTcpProxyList() + post_with_metadata.return_value = compute.TargetTcpProxyList(), metadata client.list( request, @@ -4159,6 +4236,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_backend_service_rest_bad_request( @@ -4370,10 +4448,14 @@ def test_set_backend_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_set_backend_service" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, + "post_set_backend_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_set_backend_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetBackendServiceTargetTcpProxyRequest.pb( compute.SetBackendServiceTargetTcpProxyRequest() ) @@ -4397,6 +4479,7 @@ def test_set_backend_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_backend_service( request, @@ -4408,6 +4491,7 @@ def test_set_backend_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_proxy_header_rest_bad_request( @@ -4619,10 +4703,14 @@ def test_set_proxy_header_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "post_set_proxy_header" ) as post, mock.patch.object( + transports.TargetTcpProxiesRestInterceptor, + "post_set_proxy_header_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetTcpProxiesRestInterceptor, "pre_set_proxy_header" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetProxyHeaderTargetTcpProxyRequest.pb( compute.SetProxyHeaderTargetTcpProxyRequest() ) @@ -4646,6 +4734,7 @@ def test_set_proxy_header_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_proxy_header( request, @@ -4657,6 +4746,7 @@ def test_set_proxy_header_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-compute/tests/unit/gapic/compute_v1/test_target_vpn_gateways.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_vpn_gateways.py index 53fab639dc70..8355523e47ad 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_vpn_gateways.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_target_vpn_gateways.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 +335,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 = TargetVpnGatewaysClient(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 = TargetVpnGatewaysClient(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", [ @@ -3114,10 +3164,14 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, + "post_aggregated_list_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListTargetVpnGatewaysRequest.pb( compute.AggregatedListTargetVpnGatewaysRequest() ) @@ -3143,6 +3197,10 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetVpnGatewayAggregatedList() + post_with_metadata.return_value = ( + compute.TargetVpnGatewayAggregatedList(), + metadata, + ) client.aggregated_list( request, @@ -3154,6 +3212,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteTargetVpnGatewayRequest): @@ -3286,10 +3345,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteTargetVpnGatewayRequest.pb( compute.DeleteTargetVpnGatewayRequest() ) @@ -3313,6 +3375,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3324,6 +3387,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetTargetVpnGatewayRequest): @@ -3436,10 +3500,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetTargetVpnGatewayRequest.pb( compute.GetTargetVpnGatewayRequest() ) @@ -3463,6 +3530,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetVpnGateway() + post_with_metadata.return_value = compute.TargetVpnGateway(), metadata client.get( request, @@ -3474,6 +3542,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertTargetVpnGatewayRequest): @@ -3686,10 +3755,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertTargetVpnGatewayRequest.pb( compute.InsertTargetVpnGatewayRequest() ) @@ -3713,6 +3785,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3724,6 +3797,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListTargetVpnGatewaysRequest): @@ -3812,10 +3886,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListTargetVpnGatewaysRequest.pb( compute.ListTargetVpnGatewaysRequest() ) @@ -3841,6 +3918,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TargetVpnGatewayList() + post_with_metadata.return_value = compute.TargetVpnGatewayList(), metadata client.list( request, @@ -3852,6 +3930,7 @@ def test_list_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( @@ -4057,10 +4136,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.TargetVpnGatewaysRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TargetVpnGatewaysRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsTargetVpnGatewayRequest.pb( compute.SetLabelsTargetVpnGatewayRequest() ) @@ -4084,6 +4166,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4095,6 +4178,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_url_maps.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_url_maps.py index 703a138ade2e..3bb41da0198a 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_url_maps.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_url_maps.py @@ -62,6 +62,13 @@ from google.cloud.compute_v1.services.url_maps import UrlMapsClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -280,6 +287,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 = UrlMapsClient(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 = UrlMapsClient(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", [ @@ -3963,10 +4013,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListUrlMapsRequest.pb( compute.AggregatedListUrlMapsRequest() ) @@ -3992,6 +4045,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMapsAggregatedList() + post_with_metadata.return_value = compute.UrlMapsAggregatedList(), metadata client.aggregated_list( request, @@ -4003,6 +4057,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteUrlMapRequest): @@ -4125,10 +4180,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteUrlMapRequest.pb(compute.DeleteUrlMapRequest()) transcode.return_value = { "method": "post", @@ -4150,6 +4208,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -4161,6 +4220,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetUrlMapRequest): @@ -4257,10 +4317,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetUrlMapRequest.pb(compute.GetUrlMapRequest()) transcode.return_value = { "method": "post", @@ -4282,6 +4345,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMap() + post_with_metadata.return_value = compute.UrlMap(), metadata client.get( request, @@ -4293,6 +4357,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertUrlMapRequest): @@ -4669,10 +4734,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertUrlMapRequest.pb(compute.InsertUrlMapRequest()) transcode.return_value = { "method": "post", @@ -4694,6 +4762,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4705,6 +4774,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_invalidate_cache_rest_bad_request( @@ -4908,10 +4978,13 @@ def test_invalidate_cache_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_invalidate_cache" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_invalidate_cache_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_invalidate_cache" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InvalidateCacheUrlMapRequest.pb( compute.InvalidateCacheUrlMapRequest() ) @@ -4935,6 +5008,7 @@ def test_invalidate_cache_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.invalidate_cache( request, @@ -4946,6 +5020,7 @@ def test_invalidate_cache_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListUrlMapsRequest): @@ -5032,10 +5107,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListUrlMapsRequest.pb(compute.ListUrlMapsRequest()) transcode.return_value = { "method": "post", @@ -5057,6 +5135,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMapList() + post_with_metadata.return_value = compute.UrlMapList(), metadata client.list( request, @@ -5068,6 +5147,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_patch_rest_bad_request(request_type=compute.PatchUrlMapRequest): @@ -5444,10 +5524,13 @@ def test_patch_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_patch" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_patch_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_patch" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.PatchUrlMapRequest.pb(compute.PatchUrlMapRequest()) transcode.return_value = { "method": "post", @@ -5469,6 +5552,7 @@ def test_patch_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.patch( request, @@ -5480,6 +5564,7 @@ def test_patch_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_rest_bad_request(request_type=compute.UpdateUrlMapRequest): @@ -5856,10 +5941,13 @@ def test_update_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_update" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_update_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_update" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.UpdateUrlMapRequest.pb(compute.UpdateUrlMapRequest()) transcode.return_value = { "method": "post", @@ -5881,6 +5969,7 @@ def test_update_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.update( request, @@ -5892,6 +5981,7 @@ def test_update_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_validate_rest_bad_request(request_type=compute.ValidateUrlMapRequest): @@ -6240,10 +6330,13 @@ def test_validate_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.UrlMapsRestInterceptor, "post_validate" ) as post, mock.patch.object( + transports.UrlMapsRestInterceptor, "post_validate_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.UrlMapsRestInterceptor, "pre_validate" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ValidateUrlMapRequest.pb(compute.ValidateUrlMapRequest()) transcode.return_value = { "method": "post", @@ -6267,6 +6360,7 @@ def test_validate_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.UrlMapsValidateResponse() + post_with_metadata.return_value = compute.UrlMapsValidateResponse(), metadata client.validate( request, @@ -6278,6 +6372,7 @@ def test_validate_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-compute/tests/unit/gapic/compute_v1/test_vpn_gateways.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_gateways.py index de1c3a1b2cd7..9c509c24aa49 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_gateways.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_gateways.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -300,6 +307,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = VpnGatewaysClient(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 = VpnGatewaysClient(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", [ @@ -3477,10 +3527,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListVpnGatewaysRequest.pb( compute.AggregatedListVpnGatewaysRequest() ) @@ -3506,6 +3559,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnGatewayAggregatedList() + post_with_metadata.return_value = compute.VpnGatewayAggregatedList(), metadata client.aggregated_list( request, @@ -3517,6 +3571,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteVpnGatewayRequest): @@ -3641,10 +3696,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteVpnGatewayRequest.pb( compute.DeleteVpnGatewayRequest() ) @@ -3668,6 +3726,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3679,6 +3738,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetVpnGatewayRequest): @@ -3781,10 +3841,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetVpnGatewayRequest.pb(compute.GetVpnGatewayRequest()) transcode.return_value = { "method": "post", @@ -3806,6 +3869,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnGateway() + post_with_metadata.return_value = compute.VpnGateway(), metadata client.get( request, @@ -3817,6 +3881,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_status_rest_bad_request(request_type=compute.GetStatusVpnGatewayRequest): @@ -3896,10 +3961,13 @@ def test_get_status_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_get_status" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_get_status_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_get_status" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetStatusVpnGatewayRequest.pb( compute.GetStatusVpnGatewayRequest() ) @@ -3925,6 +3993,10 @@ def test_get_status_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnGatewaysGetStatusResponse() + post_with_metadata.return_value = ( + compute.VpnGatewaysGetStatusResponse(), + metadata, + ) client.get_status( request, @@ -3936,6 +4008,7 @@ def test_get_status_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertVpnGatewayRequest): @@ -4151,10 +4224,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertVpnGatewayRequest.pb( compute.InsertVpnGatewayRequest() ) @@ -4178,6 +4254,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -4189,6 +4266,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListVpnGatewaysRequest): @@ -4277,10 +4355,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListVpnGatewaysRequest.pb(compute.ListVpnGatewaysRequest()) transcode.return_value = { "method": "post", @@ -4302,6 +4383,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnGatewayList() + post_with_metadata.return_value = compute.VpnGatewayList(), metadata client.list( request, @@ -4313,6 +4395,7 @@ def test_list_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=compute.SetLabelsVpnGatewayRequest): @@ -4516,10 +4599,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsVpnGatewayRequest.pb( compute.SetLabelsVpnGatewayRequest() ) @@ -4543,6 +4629,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4554,6 +4641,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_test_iam_permissions_rest_bad_request( @@ -4716,10 +4804,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnGatewaysRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.VpnGatewaysRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnGatewaysRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.TestIamPermissionsVpnGatewayRequest.pb( compute.TestIamPermissionsVpnGatewayRequest() ) @@ -4745,6 +4836,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.TestPermissionsResponse() + post_with_metadata.return_value = compute.TestPermissionsResponse(), metadata client.test_iam_permissions( request, @@ -4756,6 +4848,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py index e0feaec0db83..213f95ccadc9 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_vpn_tunnels.py @@ -66,6 +66,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -296,6 +303,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 = VpnTunnelsClient(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 = VpnTunnelsClient(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", [ @@ -3048,10 +3098,13 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_aggregated_list" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_aggregated_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_aggregated_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.AggregatedListVpnTunnelsRequest.pb( compute.AggregatedListVpnTunnelsRequest() ) @@ -3077,6 +3130,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnTunnelAggregatedList() + post_with_metadata.return_value = compute.VpnTunnelAggregatedList(), metadata client.aggregated_list( request, @@ -3088,6 +3142,7 @@ def test_aggregated_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_rest_bad_request(request_type=compute.DeleteVpnTunnelRequest): @@ -3212,10 +3267,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteVpnTunnelRequest.pb(compute.DeleteVpnTunnelRequest()) transcode.return_value = { "method": "post", @@ -3237,6 +3295,7 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.delete( request, @@ -3248,6 +3307,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetVpnTunnelRequest): @@ -3374,10 +3434,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetVpnTunnelRequest.pb(compute.GetVpnTunnelRequest()) transcode.return_value = { "method": "post", @@ -3399,6 +3462,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnTunnel() + post_with_metadata.return_value = compute.VpnTunnel(), metadata client.get( request, @@ -3410,6 +3474,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_insert_rest_bad_request(request_type=compute.InsertVpnTunnelRequest): @@ -3633,10 +3698,13 @@ def test_insert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_insert" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_insert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_insert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.InsertVpnTunnelRequest.pb(compute.InsertVpnTunnelRequest()) transcode.return_value = { "method": "post", @@ -3658,6 +3726,7 @@ def test_insert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.insert( request, @@ -3669,6 +3738,7 @@ def test_insert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListVpnTunnelsRequest): @@ -3757,10 +3827,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListVpnTunnelsRequest.pb(compute.ListVpnTunnelsRequest()) transcode.return_value = { "method": "post", @@ -3782,6 +3855,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.VpnTunnelList() + post_with_metadata.return_value = compute.VpnTunnelList(), metadata client.list( request, @@ -3793,6 +3867,7 @@ def test_list_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=compute.SetLabelsVpnTunnelRequest): @@ -3996,10 +4071,13 @@ def test_set_labels_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.VpnTunnelsRestInterceptor, "post_set_labels" ) as post, mock.patch.object( + transports.VpnTunnelsRestInterceptor, "post_set_labels_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.VpnTunnelsRestInterceptor, "pre_set_labels" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.SetLabelsVpnTunnelRequest.pb( compute.SetLabelsVpnTunnelRequest() ) @@ -4023,6 +4101,7 @@ def test_set_labels_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.set_labels( request, @@ -4034,6 +4113,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_initialize_client_w_rest(): diff --git a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zone_operations.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zone_operations.py index 561f63b333ae..12e0bce394a0 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zone_operations.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zone_operations.py @@ -59,6 +59,13 @@ ) from google.cloud.compute_v1.types import compute +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 @@ -312,6 +319,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 = ZoneOperationsClient(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 = ZoneOperationsClient(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", [ @@ -1926,10 +1976,13 @@ def test_delete_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZoneOperationsRestInterceptor, "post_delete" ) as post, mock.patch.object( + transports.ZoneOperationsRestInterceptor, "post_delete_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZoneOperationsRestInterceptor, "pre_delete" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.DeleteZoneOperationRequest.pb( compute.DeleteZoneOperationRequest() ) @@ -1955,6 +2008,10 @@ def test_delete_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.DeleteZoneOperationResponse() + post_with_metadata.return_value = ( + compute.DeleteZoneOperationResponse(), + metadata, + ) client.delete( request, @@ -1966,6 +2023,7 @@ def test_delete_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_rest_bad_request(request_type=compute.GetZoneOperationRequest): @@ -2090,10 +2148,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZoneOperationsRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ZoneOperationsRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZoneOperationsRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetZoneOperationRequest.pb( compute.GetZoneOperationRequest() ) @@ -2117,6 +2178,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.get( request, @@ -2128,6 +2190,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListZoneOperationsRequest): @@ -2216,10 +2279,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZoneOperationsRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ZoneOperationsRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZoneOperationsRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListZoneOperationsRequest.pb( compute.ListZoneOperationsRequest() ) @@ -2243,6 +2309,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.OperationList() + post_with_metadata.return_value = compute.OperationList(), metadata client.list( request, @@ -2254,6 +2321,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_wait_rest_bad_request(request_type=compute.WaitZoneOperationRequest): @@ -2378,10 +2446,13 @@ def test_wait_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZoneOperationsRestInterceptor, "post_wait" ) as post, mock.patch.object( + transports.ZoneOperationsRestInterceptor, "post_wait_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZoneOperationsRestInterceptor, "pre_wait" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.WaitZoneOperationRequest.pb( compute.WaitZoneOperationRequest() ) @@ -2405,6 +2476,7 @@ def test_wait_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Operation() + post_with_metadata.return_value = compute.Operation(), metadata client.wait( request, @@ -2416,6 +2488,7 @@ def test_wait_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-compute/tests/unit/gapic/compute_v1/test_zones.py b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zones.py index 73ce2d29a2dd..f6a69095c019 100644 --- a/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zones.py +++ b/packages/google-cloud-compute/tests/unit/gapic/compute_v1/test_zones.py @@ -55,6 +55,13 @@ from google.cloud.compute_v1.services.zones import ZonesClient, pagers, transports from google.cloud.compute_v1.types import compute +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 @@ -268,6 +275,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 = ZonesClient(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 = ZonesClient(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", [ @@ -1468,10 +1518,13 @@ def test_get_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZonesRestInterceptor, "post_get" ) as post, mock.patch.object( + transports.ZonesRestInterceptor, "post_get_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZonesRestInterceptor, "pre_get" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.GetZoneRequest.pb(compute.GetZoneRequest()) transcode.return_value = { "method": "post", @@ -1493,6 +1546,7 @@ def test_get_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.Zone() + post_with_metadata.return_value = compute.Zone(), metadata client.get( request, @@ -1504,6 +1558,7 @@ def test_get_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_rest_bad_request(request_type=compute.ListZonesRequest): @@ -1590,10 +1645,13 @@ def test_list_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ZonesRestInterceptor, "post_list" ) as post, mock.patch.object( + transports.ZonesRestInterceptor, "post_list_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ZonesRestInterceptor, "pre_list" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = compute.ListZonesRequest.pb(compute.ListZonesRequest()) transcode.return_value = { "method": "post", @@ -1615,6 +1673,7 @@ def test_list_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = compute.ZoneList() + post_with_metadata.return_value = compute.ZoneList(), metadata client.list( request, @@ -1626,6 +1685,7 @@ def test_list_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest():