diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py index ce3bb2fb8680..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.22.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py index ce3bb2fb8680..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.22.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py index ff51c2e75ee8..a5484ffb094f 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -532,6 +534,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2541,16 +2570,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2596,16 +2629,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/rest.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/rest.py index ecb623152afa..e0752f2c9478 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/rest.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1/services/secret_manager_service/transports/rest.py @@ -213,12 +213,37 @@ def post_access_secret_version( ) -> service.AccessSecretVersionResponse: """Post-rpc interceptor for access_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_access_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_access_secret_version` interceptor runs + before the `post_access_secret_version_with_metadata` interceptor. """ return response + def post_access_secret_version_with_metadata( + self, + response: service.AccessSecretVersionResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.AccessSecretVersionResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for access_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_access_secret_version_with_metadata` + interceptor in new development instead of the `post_access_secret_version` interceptor. + When both interceptors are used, this `post_access_secret_version_with_metadata` interceptor runs after the + `post_access_secret_version` interceptor. The (possibly modified) response returned by + `post_access_secret_version` will be passed to + `post_access_secret_version_with_metadata`. + """ + return response, metadata + def pre_add_secret_version( self, request: service.AddSecretVersionRequest, @@ -238,12 +263,35 @@ def post_add_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for add_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_add_secret_version` interceptor runs + before the `post_add_secret_version_with_metadata` interceptor. """ return response + def post_add_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_add_secret_version_with_metadata` + interceptor in new development instead of the `post_add_secret_version` interceptor. + When both interceptors are used, this `post_add_secret_version_with_metadata` interceptor runs after the + `post_add_secret_version` interceptor. The (possibly modified) response returned by + `post_add_secret_version` will be passed to + `post_add_secret_version_with_metadata`. + """ + return response, metadata + def pre_create_secret( self, request: service.CreateSecretRequest, @@ -259,12 +307,35 @@ def pre_create_secret( def post_create_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for create_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_create_secret` interceptor runs + before the `post_create_secret_with_metadata` interceptor. """ return response + def post_create_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_create_secret_with_metadata` + interceptor in new development instead of the `post_create_secret` interceptor. + When both interceptors are used, this `post_create_secret_with_metadata` interceptor runs after the + `post_create_secret` interceptor. The (possibly modified) response returned by + `post_create_secret` will be passed to + `post_create_secret_with_metadata`. + """ + return response, metadata + def pre_delete_secret( self, request: service.DeleteSecretRequest, @@ -296,12 +367,35 @@ def post_destroy_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for destroy_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_destroy_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_destroy_secret_version` interceptor runs + before the `post_destroy_secret_version_with_metadata` interceptor. """ return response + def post_destroy_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for destroy_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_destroy_secret_version_with_metadata` + interceptor in new development instead of the `post_destroy_secret_version` interceptor. + When both interceptors are used, this `post_destroy_secret_version_with_metadata` interceptor runs after the + `post_destroy_secret_version` interceptor. The (possibly modified) response returned by + `post_destroy_secret_version` will be passed to + `post_destroy_secret_version_with_metadata`. + """ + return response, metadata + def pre_disable_secret_version( self, request: service.DisableSecretVersionRequest, @@ -321,12 +415,35 @@ def post_disable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for disable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_disable_secret_version` interceptor runs + before the `post_disable_secret_version_with_metadata` interceptor. """ return response + def post_disable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_disable_secret_version_with_metadata` + interceptor in new development instead of the `post_disable_secret_version` interceptor. + When both interceptors are used, this `post_disable_secret_version_with_metadata` interceptor runs after the + `post_disable_secret_version` interceptor. The (possibly modified) response returned by + `post_disable_secret_version` will be passed to + `post_disable_secret_version_with_metadata`. + """ + return response, metadata + def pre_enable_secret_version( self, request: service.EnableSecretVersionRequest, @@ -346,12 +463,35 @@ def post_enable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for enable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_enable_secret_version` interceptor runs + before the `post_enable_secret_version_with_metadata` interceptor. """ return response + def post_enable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_enable_secret_version_with_metadata` + interceptor in new development instead of the `post_enable_secret_version` interceptor. + When both interceptors are used, this `post_enable_secret_version_with_metadata` interceptor runs after the + `post_enable_secret_version` interceptor. The (possibly modified) response returned by + `post_enable_secret_version` will be passed to + `post_enable_secret_version_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -369,12 +509,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.GetSecretRequest, @@ -390,12 +553,35 @@ def pre_get_secret( def post_get_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for get_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret` interceptor runs + before the `post_get_secret_with_metadata` interceptor. """ return response + def post_get_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_with_metadata` + interceptor in new development instead of the `post_get_secret` interceptor. + When both interceptors are used, this `post_get_secret_with_metadata` interceptor runs after the + `post_get_secret` interceptor. The (possibly modified) response returned by + `post_get_secret` will be passed to + `post_get_secret_with_metadata`. + """ + return response, metadata + def pre_get_secret_version( self, request: service.GetSecretVersionRequest, @@ -415,12 +601,35 @@ def post_get_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for get_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret_version` interceptor runs + before the `post_get_secret_version_with_metadata` interceptor. """ return response + def post_get_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_version_with_metadata` + interceptor in new development instead of the `post_get_secret_version` interceptor. + When both interceptors are used, this `post_get_secret_version_with_metadata` interceptor runs after the + `post_get_secret_version` interceptor. The (possibly modified) response returned by + `post_get_secret_version` will be passed to + `post_get_secret_version_with_metadata`. + """ + return response, metadata + def pre_list_secrets( self, request: service.ListSecretsRequest, @@ -438,12 +647,35 @@ def post_list_secrets( ) -> service.ListSecretsResponse: """Post-rpc interceptor for list_secrets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secrets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secrets` interceptor runs + before the `post_list_secrets_with_metadata` interceptor. """ return response + def post_list_secrets_with_metadata( + self, + response: service.ListSecretsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListSecretsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_secrets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secrets_with_metadata` + interceptor in new development instead of the `post_list_secrets` interceptor. + When both interceptors are used, this `post_list_secrets_with_metadata` interceptor runs after the + `post_list_secrets` interceptor. The (possibly modified) response returned by + `post_list_secrets` will be passed to + `post_list_secrets_with_metadata`. + """ + return response, metadata + def pre_list_secret_versions( self, request: service.ListSecretVersionsRequest, @@ -463,12 +695,37 @@ def post_list_secret_versions( ) -> service.ListSecretVersionsResponse: """Post-rpc interceptor for list_secret_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secret_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secret_versions` interceptor runs + before the `post_list_secret_versions_with_metadata` interceptor. """ return response + def post_list_secret_versions_with_metadata( + self, + response: service.ListSecretVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSecretVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_secret_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secret_versions_with_metadata` + interceptor in new development instead of the `post_list_secret_versions` interceptor. + When both interceptors are used, this `post_list_secret_versions_with_metadata` interceptor runs after the + `post_list_secret_versions` interceptor. The (possibly modified) response returned by + `post_list_secret_versions` will be passed to + `post_list_secret_versions_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -486,12 +743,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -512,12 +792,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.UpdateSecretRequest, @@ -533,12 +839,35 @@ def pre_update_secret( def post_update_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for update_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_update_secret` interceptor runs + before the `post_update_secret_with_metadata` interceptor. """ return response + def post_update_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_update_secret_with_metadata` + interceptor in new development instead of the `post_update_secret` interceptor. + When both interceptors are used, this `post_update_secret_with_metadata` interceptor runs after the + `post_update_secret` interceptor. The (possibly modified) response returned by + `post_update_secret` will be passed to + `post_update_secret_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -807,6 +1136,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_access_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_access_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -963,6 +1296,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1118,6 +1455,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1380,6 +1721,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_destroy_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_destroy_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1534,6 +1879,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1688,6 +2037,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1904,6 +2257,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 @@ -2053,6 +2410,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2201,6 +2562,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2345,6 +2710,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secrets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secrets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2493,6 +2862,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secret_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secret_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2717,6 +3090,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 @@ -2868,6 +3245,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 @@ -3023,6 +3404,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py index ce3bb2fb8680..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.22.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/client.py index 11733fa5dc99..0acff3fc6cde 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -513,6 +515,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-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/transports/rest.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/transports/rest.py index 48ccca6d5bc6..a35bcc285180 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/transports/rest.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta1/services/secret_manager_service/transports/rest.py @@ -212,12 +212,37 @@ def post_access_secret_version( ) -> service.AccessSecretVersionResponse: """Post-rpc interceptor for access_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_access_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_access_secret_version` interceptor runs + before the `post_access_secret_version_with_metadata` interceptor. """ return response + def post_access_secret_version_with_metadata( + self, + response: service.AccessSecretVersionResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.AccessSecretVersionResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for access_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_access_secret_version_with_metadata` + interceptor in new development instead of the `post_access_secret_version` interceptor. + When both interceptors are used, this `post_access_secret_version_with_metadata` interceptor runs after the + `post_access_secret_version` interceptor. The (possibly modified) response returned by + `post_access_secret_version` will be passed to + `post_access_secret_version_with_metadata`. + """ + return response, metadata + def pre_add_secret_version( self, request: service.AddSecretVersionRequest, @@ -237,12 +262,35 @@ def post_add_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for add_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_add_secret_version` interceptor runs + before the `post_add_secret_version_with_metadata` interceptor. """ return response + def post_add_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_add_secret_version_with_metadata` + interceptor in new development instead of the `post_add_secret_version` interceptor. + When both interceptors are used, this `post_add_secret_version_with_metadata` interceptor runs after the + `post_add_secret_version` interceptor. The (possibly modified) response returned by + `post_add_secret_version` will be passed to + `post_add_secret_version_with_metadata`. + """ + return response, metadata + def pre_create_secret( self, request: service.CreateSecretRequest, @@ -258,12 +306,35 @@ def pre_create_secret( def post_create_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for create_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_create_secret` interceptor runs + before the `post_create_secret_with_metadata` interceptor. """ return response + def post_create_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_create_secret_with_metadata` + interceptor in new development instead of the `post_create_secret` interceptor. + When both interceptors are used, this `post_create_secret_with_metadata` interceptor runs after the + `post_create_secret` interceptor. The (possibly modified) response returned by + `post_create_secret` will be passed to + `post_create_secret_with_metadata`. + """ + return response, metadata + def pre_delete_secret( self, request: service.DeleteSecretRequest, @@ -295,12 +366,35 @@ def post_destroy_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for destroy_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_destroy_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_destroy_secret_version` interceptor runs + before the `post_destroy_secret_version_with_metadata` interceptor. """ return response + def post_destroy_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for destroy_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_destroy_secret_version_with_metadata` + interceptor in new development instead of the `post_destroy_secret_version` interceptor. + When both interceptors are used, this `post_destroy_secret_version_with_metadata` interceptor runs after the + `post_destroy_secret_version` interceptor. The (possibly modified) response returned by + `post_destroy_secret_version` will be passed to + `post_destroy_secret_version_with_metadata`. + """ + return response, metadata + def pre_disable_secret_version( self, request: service.DisableSecretVersionRequest, @@ -320,12 +414,35 @@ def post_disable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for disable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_disable_secret_version` interceptor runs + before the `post_disable_secret_version_with_metadata` interceptor. """ return response + def post_disable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_disable_secret_version_with_metadata` + interceptor in new development instead of the `post_disable_secret_version` interceptor. + When both interceptors are used, this `post_disable_secret_version_with_metadata` interceptor runs after the + `post_disable_secret_version` interceptor. The (possibly modified) response returned by + `post_disable_secret_version` will be passed to + `post_disable_secret_version_with_metadata`. + """ + return response, metadata + def pre_enable_secret_version( self, request: service.EnableSecretVersionRequest, @@ -345,12 +462,35 @@ def post_enable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for enable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_enable_secret_version` interceptor runs + before the `post_enable_secret_version_with_metadata` interceptor. """ return response + def post_enable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_enable_secret_version_with_metadata` + interceptor in new development instead of the `post_enable_secret_version` interceptor. + When both interceptors are used, this `post_enable_secret_version_with_metadata` interceptor runs after the + `post_enable_secret_version` interceptor. The (possibly modified) response returned by + `post_enable_secret_version` will be passed to + `post_enable_secret_version_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -368,12 +508,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.GetSecretRequest, @@ -389,12 +552,35 @@ def pre_get_secret( def post_get_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for get_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret` interceptor runs + before the `post_get_secret_with_metadata` interceptor. """ return response + def post_get_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_with_metadata` + interceptor in new development instead of the `post_get_secret` interceptor. + When both interceptors are used, this `post_get_secret_with_metadata` interceptor runs after the + `post_get_secret` interceptor. The (possibly modified) response returned by + `post_get_secret` will be passed to + `post_get_secret_with_metadata`. + """ + return response, metadata + def pre_get_secret_version( self, request: service.GetSecretVersionRequest, @@ -414,12 +600,35 @@ def post_get_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for get_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret_version` interceptor runs + before the `post_get_secret_version_with_metadata` interceptor. """ return response + def post_get_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_version_with_metadata` + interceptor in new development instead of the `post_get_secret_version` interceptor. + When both interceptors are used, this `post_get_secret_version_with_metadata` interceptor runs after the + `post_get_secret_version` interceptor. The (possibly modified) response returned by + `post_get_secret_version` will be passed to + `post_get_secret_version_with_metadata`. + """ + return response, metadata + def pre_list_secrets( self, request: service.ListSecretsRequest, @@ -437,12 +646,35 @@ def post_list_secrets( ) -> service.ListSecretsResponse: """Post-rpc interceptor for list_secrets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secrets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secrets` interceptor runs + before the `post_list_secrets_with_metadata` interceptor. """ return response + def post_list_secrets_with_metadata( + self, + response: service.ListSecretsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListSecretsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_secrets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secrets_with_metadata` + interceptor in new development instead of the `post_list_secrets` interceptor. + When both interceptors are used, this `post_list_secrets_with_metadata` interceptor runs after the + `post_list_secrets` interceptor. The (possibly modified) response returned by + `post_list_secrets` will be passed to + `post_list_secrets_with_metadata`. + """ + return response, metadata + def pre_list_secret_versions( self, request: service.ListSecretVersionsRequest, @@ -462,12 +694,37 @@ def post_list_secret_versions( ) -> service.ListSecretVersionsResponse: """Post-rpc interceptor for list_secret_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secret_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secret_versions` interceptor runs + before the `post_list_secret_versions_with_metadata` interceptor. """ return response + def post_list_secret_versions_with_metadata( + self, + response: service.ListSecretVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSecretVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_secret_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secret_versions_with_metadata` + interceptor in new development instead of the `post_list_secret_versions` interceptor. + When both interceptors are used, this `post_list_secret_versions_with_metadata` interceptor runs after the + `post_list_secret_versions` interceptor. The (possibly modified) response returned by + `post_list_secret_versions` will be passed to + `post_list_secret_versions_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -485,12 +742,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -511,12 +791,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.UpdateSecretRequest, @@ -532,12 +838,35 @@ def pre_update_secret( def post_update_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for update_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_update_secret` interceptor runs + before the `post_update_secret_with_metadata` interceptor. """ return response + def post_update_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_update_secret_with_metadata` + interceptor in new development instead of the `post_update_secret` interceptor. + When both interceptors are used, this `post_update_secret_with_metadata` interceptor runs after the + `post_update_secret` interceptor. The (possibly modified) response returned by + `post_update_secret` will be passed to + `post_update_secret_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SecretManagerServiceRestStub: @@ -756,6 +1085,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_access_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_access_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -912,6 +1245,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1067,6 +1404,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1329,6 +1670,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_destroy_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_destroy_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1483,6 +1828,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1637,6 +1986,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1853,6 +2206,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 @@ -2002,6 +2359,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2150,6 +2511,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2294,6 +2659,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secrets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secrets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2442,6 +2811,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secret_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secret_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2666,6 +3039,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 @@ -2817,6 +3194,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 @@ -2972,6 +3353,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py index ce3bb2fb8680..558c8aab67c5 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.22.1" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/client.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/client.py index e9f110b0863b..2ebd28fef3cc 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/client.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -532,6 +534,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2546,16 +2575,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2601,16 +2634,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/transports/rest.py b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/transports/rest.py index 73f02bbe4da0..7eb3fc843deb 100644 --- a/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/transports/rest.py +++ b/packages/google-cloud-secret-manager/google/cloud/secretmanager_v1beta2/services/secret_manager_service/transports/rest.py @@ -213,12 +213,37 @@ def post_access_secret_version( ) -> service.AccessSecretVersionResponse: """Post-rpc interceptor for access_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_access_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_access_secret_version` interceptor runs + before the `post_access_secret_version_with_metadata` interceptor. """ return response + def post_access_secret_version_with_metadata( + self, + response: service.AccessSecretVersionResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.AccessSecretVersionResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for access_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_access_secret_version_with_metadata` + interceptor in new development instead of the `post_access_secret_version` interceptor. + When both interceptors are used, this `post_access_secret_version_with_metadata` interceptor runs after the + `post_access_secret_version` interceptor. The (possibly modified) response returned by + `post_access_secret_version` will be passed to + `post_access_secret_version_with_metadata`. + """ + return response, metadata + def pre_add_secret_version( self, request: service.AddSecretVersionRequest, @@ -238,12 +263,35 @@ def post_add_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for add_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_add_secret_version` interceptor runs + before the `post_add_secret_version_with_metadata` interceptor. """ return response + def post_add_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_add_secret_version_with_metadata` + interceptor in new development instead of the `post_add_secret_version` interceptor. + When both interceptors are used, this `post_add_secret_version_with_metadata` interceptor runs after the + `post_add_secret_version` interceptor. The (possibly modified) response returned by + `post_add_secret_version` will be passed to + `post_add_secret_version_with_metadata`. + """ + return response, metadata + def pre_create_secret( self, request: service.CreateSecretRequest, @@ -259,12 +307,35 @@ def pre_create_secret( def post_create_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for create_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_create_secret` interceptor runs + before the `post_create_secret_with_metadata` interceptor. """ return response + def post_create_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_create_secret_with_metadata` + interceptor in new development instead of the `post_create_secret` interceptor. + When both interceptors are used, this `post_create_secret_with_metadata` interceptor runs after the + `post_create_secret` interceptor. The (possibly modified) response returned by + `post_create_secret` will be passed to + `post_create_secret_with_metadata`. + """ + return response, metadata + def pre_delete_secret( self, request: service.DeleteSecretRequest, @@ -296,12 +367,35 @@ def post_destroy_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for destroy_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_destroy_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_destroy_secret_version` interceptor runs + before the `post_destroy_secret_version_with_metadata` interceptor. """ return response + def post_destroy_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for destroy_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_destroy_secret_version_with_metadata` + interceptor in new development instead of the `post_destroy_secret_version` interceptor. + When both interceptors are used, this `post_destroy_secret_version_with_metadata` interceptor runs after the + `post_destroy_secret_version` interceptor. The (possibly modified) response returned by + `post_destroy_secret_version` will be passed to + `post_destroy_secret_version_with_metadata`. + """ + return response, metadata + def pre_disable_secret_version( self, request: service.DisableSecretVersionRequest, @@ -321,12 +415,35 @@ def post_disable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for disable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_disable_secret_version` interceptor runs + before the `post_disable_secret_version_with_metadata` interceptor. """ return response + def post_disable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_disable_secret_version_with_metadata` + interceptor in new development instead of the `post_disable_secret_version` interceptor. + When both interceptors are used, this `post_disable_secret_version_with_metadata` interceptor runs after the + `post_disable_secret_version` interceptor. The (possibly modified) response returned by + `post_disable_secret_version` will be passed to + `post_disable_secret_version_with_metadata`. + """ + return response, metadata + def pre_enable_secret_version( self, request: service.EnableSecretVersionRequest, @@ -346,12 +463,35 @@ def post_enable_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for enable_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_enable_secret_version` interceptor runs + before the `post_enable_secret_version_with_metadata` interceptor. """ return response + def post_enable_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_enable_secret_version_with_metadata` + interceptor in new development instead of the `post_enable_secret_version` interceptor. + When both interceptors are used, this `post_enable_secret_version_with_metadata` interceptor runs after the + `post_enable_secret_version` interceptor. The (possibly modified) response returned by + `post_enable_secret_version` will be passed to + `post_enable_secret_version_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -369,12 +509,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.GetSecretRequest, @@ -390,12 +553,35 @@ def pre_get_secret( def post_get_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for get_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret` interceptor runs + before the `post_get_secret_with_metadata` interceptor. """ return response + def post_get_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_with_metadata` + interceptor in new development instead of the `post_get_secret` interceptor. + When both interceptors are used, this `post_get_secret_with_metadata` interceptor runs after the + `post_get_secret` interceptor. The (possibly modified) response returned by + `post_get_secret` will be passed to + `post_get_secret_with_metadata`. + """ + return response, metadata + def pre_get_secret_version( self, request: service.GetSecretVersionRequest, @@ -415,12 +601,35 @@ def post_get_secret_version( ) -> resources.SecretVersion: """Post-rpc interceptor for get_secret_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_secret_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_get_secret_version` interceptor runs + before the `post_get_secret_version_with_metadata` interceptor. """ return response + def post_get_secret_version_with_metadata( + self, + response: resources.SecretVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.SecretVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_secret_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_get_secret_version_with_metadata` + interceptor in new development instead of the `post_get_secret_version` interceptor. + When both interceptors are used, this `post_get_secret_version_with_metadata` interceptor runs after the + `post_get_secret_version` interceptor. The (possibly modified) response returned by + `post_get_secret_version` will be passed to + `post_get_secret_version_with_metadata`. + """ + return response, metadata + def pre_list_secrets( self, request: service.ListSecretsRequest, @@ -438,12 +647,35 @@ def post_list_secrets( ) -> service.ListSecretsResponse: """Post-rpc interceptor for list_secrets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secrets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secrets` interceptor runs + before the `post_list_secrets_with_metadata` interceptor. """ return response + def post_list_secrets_with_metadata( + self, + response: service.ListSecretsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.ListSecretsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_secrets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secrets_with_metadata` + interceptor in new development instead of the `post_list_secrets` interceptor. + When both interceptors are used, this `post_list_secrets_with_metadata` interceptor runs after the + `post_list_secrets` interceptor. The (possibly modified) response returned by + `post_list_secrets` will be passed to + `post_list_secrets_with_metadata`. + """ + return response, metadata + def pre_list_secret_versions( self, request: service.ListSecretVersionsRequest, @@ -463,12 +695,37 @@ def post_list_secret_versions( ) -> service.ListSecretVersionsResponse: """Post-rpc interceptor for list_secret_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_secret_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_list_secret_versions` interceptor runs + before the `post_list_secret_versions_with_metadata` interceptor. """ return response + def post_list_secret_versions_with_metadata( + self, + response: service.ListSecretVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service.ListSecretVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_secret_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_list_secret_versions_with_metadata` + interceptor in new development instead of the `post_list_secret_versions` interceptor. + When both interceptors are used, this `post_list_secret_versions_with_metadata` interceptor runs after the + `post_list_secret_versions` interceptor. The (possibly modified) response returned by + `post_list_secret_versions` will be passed to + `post_list_secret_versions_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -486,12 +743,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -512,12 +792,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService 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_secret( self, request: service.UpdateSecretRequest, @@ -533,12 +839,35 @@ def pre_update_secret( def post_update_secret(self, response: resources.Secret) -> resources.Secret: """Post-rpc interceptor for update_secret - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_secret_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecretManagerService server but before - it is returned to user code. + it is returned to user code. This `post_update_secret` interceptor runs + before the `post_update_secret_with_metadata` interceptor. """ return response + def post_update_secret_with_metadata( + self, + response: resources.Secret, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Secret, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_secret + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecretManagerService server but before it is returned to user code. + + We recommend only using this `post_update_secret_with_metadata` + interceptor in new development instead of the `post_update_secret` interceptor. + When both interceptors are used, this `post_update_secret_with_metadata` interceptor runs after the + `post_update_secret` interceptor. The (possibly modified) response returned by + `post_update_secret` will be passed to + `post_update_secret_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -807,6 +1136,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_access_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_access_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -963,6 +1296,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1119,6 +1456,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1381,6 +1722,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_destroy_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_destroy_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1535,6 +1880,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1689,6 +2038,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1905,6 +2258,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 @@ -2055,6 +2412,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2203,6 +2564,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_secret_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_secret_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2347,6 +2712,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secrets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secrets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2495,6 +2864,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_secret_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_secret_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2719,6 +3092,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 @@ -2870,6 +3247,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 @@ -3026,6 +3407,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_secret(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_secret_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json index 42f8c7310cb3..e75ffe273c93 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secret-manager", - "version": "2.22.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json index 00b3166bc7ad..f2d2a2eaea8e 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secretmanager.v1beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secretmanager", - "version": "2.22.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json index 9188d47b583c..cdba6a34a0ba 100644 --- a/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json +++ b/packages/google-cloud-secret-manager/samples/generated_samples/snippet_metadata_google.cloud.secrets.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-secretmanager", - "version": "2.22.1" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py index 1bf71bf19b09..1bcc4c97f540 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1/test_secret_manager_service.py @@ -68,6 +68,13 @@ ) from google.cloud.secretmanager_v1.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -341,6 +348,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SecretManagerServiceClient(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 = SecretManagerServiceClient(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", [ @@ -10146,10 +10196,14 @@ def test_list_secrets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secrets" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secrets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secrets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretsRequest.pb(service.ListSecretsRequest()) transcode.return_value = { "method": "post", @@ -10173,6 +10227,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretsResponse() + post_with_metadata.return_value = service.ListSecretsResponse(), metadata client.list_secrets( request, @@ -10184,6 +10239,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secret_rest_bad_request(request_type=service.CreateSecretRequest): @@ -10359,10 +10415,14 @@ def test_create_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_create_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_create_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_create_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecretRequest.pb(service.CreateSecretRequest()) transcode.return_value = { "method": "post", @@ -10384,6 +10444,7 @@ def test_create_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.create_secret( request, @@ -10395,6 +10456,7 @@ def test_create_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_secret_version_rest_bad_request( @@ -10485,10 +10547,14 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_add_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_add_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_add_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AddSecretVersionRequest.pb( service.AddSecretVersionRequest() ) @@ -10512,6 +10578,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.add_secret_version( request, @@ -10523,6 +10590,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_rest_bad_request(request_type=service.GetSecretRequest): @@ -10607,10 +10675,13 @@ def test_get_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, "post_get_secret_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretRequest.pb(service.GetSecretRequest()) transcode.return_value = { "method": "post", @@ -10632,6 +10703,7 @@ def test_get_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.get_secret( request, @@ -10643,6 +10715,7 @@ def test_get_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_secret_rest_bad_request(request_type=service.UpdateSecretRequest): @@ -10818,10 +10891,14 @@ def test_update_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_update_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_update_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_update_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSecretRequest.pb(service.UpdateSecretRequest()) transcode.return_value = { "method": "post", @@ -10843,6 +10920,7 @@ def test_update_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.update_secret( request, @@ -10854,6 +10932,7 @@ def test_update_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_secret_rest_bad_request(request_type=service.DeleteSecretRequest): @@ -11045,10 +11124,14 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secret_versions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secret_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secret_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretVersionsRequest.pb( service.ListSecretVersionsRequest() ) @@ -11074,6 +11157,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretVersionsResponse() + post_with_metadata.return_value = service.ListSecretVersionsResponse(), metadata client.list_secret_versions( request, @@ -11085,6 +11169,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_version_rest_bad_request( @@ -11175,10 +11260,14 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretVersionRequest.pb( service.GetSecretVersionRequest() ) @@ -11202,6 +11291,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.get_secret_version( request, @@ -11213,6 +11303,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_access_secret_version_rest_bad_request( @@ -11297,10 +11388,14 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_access_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_access_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_access_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AccessSecretVersionRequest.pb( service.AccessSecretVersionRequest() ) @@ -11326,6 +11421,10 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.AccessSecretVersionResponse() + post_with_metadata.return_value = ( + service.AccessSecretVersionResponse(), + metadata, + ) client.access_secret_version( request, @@ -11337,6 +11436,7 @@ def test_access_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_secret_version_rest_bad_request( @@ -11427,10 +11527,14 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_disable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_disable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_disable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DisableSecretVersionRequest.pb( service.DisableSecretVersionRequest() ) @@ -11454,6 +11558,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.disable_secret_version( request, @@ -11465,6 +11570,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_secret_version_rest_bad_request( @@ -11555,10 +11661,14 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_enable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_enable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_enable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EnableSecretVersionRequest.pb( service.EnableSecretVersionRequest() ) @@ -11582,6 +11692,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.enable_secret_version( request, @@ -11593,6 +11704,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_destroy_secret_version_rest_bad_request( @@ -11683,10 +11795,14 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_destroy_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_destroy_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_destroy_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DestroySecretVersionRequest.pb( service.DestroySecretVersionRequest() ) @@ -11710,6 +11826,7 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.destroy_secret_version( request, @@ -11721,6 +11838,7 @@ def test_destroy_secret_version_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( @@ -11804,10 +11922,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11829,6 +11951,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -11840,6 +11963,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -11923,10 +12047,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11948,6 +12076,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -11959,6 +12088,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -12040,10 +12170,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -12067,6 +12201,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -12078,6 +12216,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta1/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta1/test_secret_manager_service.py index 7cbe393d7e22..4465c80b321a 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta1/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta1/test_secret_manager_service.py @@ -66,6 +66,13 @@ ) from google.cloud.secretmanager_v1beta1.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = SecretManagerServiceClient(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 = SecretManagerServiceClient(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", [ @@ -10065,10 +10115,14 @@ def test_list_secrets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secrets" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secrets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secrets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretsRequest.pb(service.ListSecretsRequest()) transcode.return_value = { "method": "post", @@ -10092,6 +10146,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretsResponse() + post_with_metadata.return_value = service.ListSecretsResponse(), metadata client.list_secrets( request, @@ -10103,6 +10158,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secret_rest_bad_request(request_type=service.CreateSecretRequest): @@ -10261,10 +10317,14 @@ def test_create_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_create_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_create_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_create_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecretRequest.pb(service.CreateSecretRequest()) transcode.return_value = { "method": "post", @@ -10286,6 +10346,7 @@ def test_create_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.create_secret( request, @@ -10297,6 +10358,7 @@ def test_create_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_secret_version_rest_bad_request( @@ -10383,10 +10445,14 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_add_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_add_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_add_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AddSecretVersionRequest.pb( service.AddSecretVersionRequest() ) @@ -10410,6 +10476,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.add_secret_version( request, @@ -10421,6 +10488,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_rest_bad_request(request_type=service.GetSecretRequest): @@ -10503,10 +10571,13 @@ def test_get_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, "post_get_secret_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretRequest.pb(service.GetSecretRequest()) transcode.return_value = { "method": "post", @@ -10528,6 +10599,7 @@ def test_get_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.get_secret( request, @@ -10539,6 +10611,7 @@ def test_get_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_secret_rest_bad_request(request_type=service.UpdateSecretRequest): @@ -10697,10 +10770,14 @@ def test_update_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_update_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_update_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_update_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSecretRequest.pb(service.UpdateSecretRequest()) transcode.return_value = { "method": "post", @@ -10722,6 +10799,7 @@ def test_update_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.update_secret( request, @@ -10733,6 +10811,7 @@ def test_update_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_secret_rest_bad_request(request_type=service.DeleteSecretRequest): @@ -10924,10 +11003,14 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secret_versions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secret_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secret_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretVersionsRequest.pb( service.ListSecretVersionsRequest() ) @@ -10953,6 +11036,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretVersionsResponse() + post_with_metadata.return_value = service.ListSecretVersionsResponse(), metadata client.list_secret_versions( request, @@ -10964,6 +11048,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_version_rest_bad_request( @@ -11050,10 +11135,14 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretVersionRequest.pb( service.GetSecretVersionRequest() ) @@ -11077,6 +11166,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.get_secret_version( request, @@ -11088,6 +11178,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_access_secret_version_rest_bad_request( @@ -11172,10 +11263,14 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_access_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_access_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_access_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AccessSecretVersionRequest.pb( service.AccessSecretVersionRequest() ) @@ -11201,6 +11296,10 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.AccessSecretVersionResponse() + post_with_metadata.return_value = ( + service.AccessSecretVersionResponse(), + metadata, + ) client.access_secret_version( request, @@ -11212,6 +11311,7 @@ def test_access_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_secret_version_rest_bad_request( @@ -11298,10 +11398,14 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_disable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_disable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_disable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DisableSecretVersionRequest.pb( service.DisableSecretVersionRequest() ) @@ -11325,6 +11429,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.disable_secret_version( request, @@ -11336,6 +11441,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_secret_version_rest_bad_request( @@ -11422,10 +11528,14 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_enable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_enable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_enable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EnableSecretVersionRequest.pb( service.EnableSecretVersionRequest() ) @@ -11449,6 +11559,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.enable_secret_version( request, @@ -11460,6 +11571,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_destroy_secret_version_rest_bad_request( @@ -11546,10 +11658,14 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_destroy_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_destroy_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_destroy_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DestroySecretVersionRequest.pb( service.DestroySecretVersionRequest() ) @@ -11573,6 +11689,7 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.destroy_secret_version( request, @@ -11584,6 +11701,7 @@ def test_destroy_secret_version_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( @@ -11667,10 +11785,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11692,6 +11814,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -11703,6 +11826,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -11786,10 +11910,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11811,6 +11939,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -11822,6 +11951,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -11903,10 +12033,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -11930,6 +12064,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -11941,6 +12079,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-secret-manager/tests/unit/gapic/secretmanager_v1beta2/test_secret_manager_service.py b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta2/test_secret_manager_service.py index e34d9873676d..5c7c31621b6a 100644 --- a/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta2/test_secret_manager_service.py +++ b/packages/google-cloud-secret-manager/tests/unit/gapic/secretmanager_v1beta2/test_secret_manager_service.py @@ -68,6 +68,13 @@ ) from google.cloud.secretmanager_v1beta2.types import resources, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -341,6 +348,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SecretManagerServiceClient(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 = SecretManagerServiceClient(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", [ @@ -10150,10 +10200,14 @@ def test_list_secrets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secrets" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secrets_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secrets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretsRequest.pb(service.ListSecretsRequest()) transcode.return_value = { "method": "post", @@ -10177,6 +10231,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretsResponse() + post_with_metadata.return_value = service.ListSecretsResponse(), metadata client.list_secrets( request, @@ -10188,6 +10243,7 @@ def test_list_secrets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_secret_rest_bad_request(request_type=service.CreateSecretRequest): @@ -10363,10 +10419,14 @@ def test_create_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_create_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_create_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_create_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.CreateSecretRequest.pb(service.CreateSecretRequest()) transcode.return_value = { "method": "post", @@ -10388,6 +10448,7 @@ def test_create_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.create_secret( request, @@ -10399,6 +10460,7 @@ def test_create_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_secret_version_rest_bad_request( @@ -10489,10 +10551,14 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_add_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_add_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_add_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AddSecretVersionRequest.pb( service.AddSecretVersionRequest() ) @@ -10516,6 +10582,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.add_secret_version( request, @@ -10527,6 +10594,7 @@ def test_add_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_rest_bad_request(request_type=service.GetSecretRequest): @@ -10611,10 +10679,13 @@ def test_get_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, "post_get_secret_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretRequest.pb(service.GetSecretRequest()) transcode.return_value = { "method": "post", @@ -10636,6 +10707,7 @@ def test_get_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.get_secret( request, @@ -10647,6 +10719,7 @@ def test_get_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_secret_rest_bad_request(request_type=service.UpdateSecretRequest): @@ -10822,10 +10895,14 @@ def test_update_secret_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_update_secret" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_update_secret_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_update_secret" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.UpdateSecretRequest.pb(service.UpdateSecretRequest()) transcode.return_value = { "method": "post", @@ -10847,6 +10924,7 @@ def test_update_secret_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Secret() + post_with_metadata.return_value = resources.Secret(), metadata client.update_secret( request, @@ -10858,6 +10936,7 @@ def test_update_secret_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_secret_rest_bad_request(request_type=service.DeleteSecretRequest): @@ -11049,10 +11128,14 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_list_secret_versions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_list_secret_versions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_list_secret_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.ListSecretVersionsRequest.pb( service.ListSecretVersionsRequest() ) @@ -11078,6 +11161,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.ListSecretVersionsResponse() + post_with_metadata.return_value = service.ListSecretVersionsResponse(), metadata client.list_secret_versions( request, @@ -11089,6 +11173,7 @@ def test_list_secret_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_secret_version_rest_bad_request( @@ -11179,10 +11264,14 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.GetSecretVersionRequest.pb( service.GetSecretVersionRequest() ) @@ -11206,6 +11295,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.get_secret_version( request, @@ -11217,6 +11307,7 @@ def test_get_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_access_secret_version_rest_bad_request( @@ -11301,10 +11392,14 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_access_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_access_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_access_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.AccessSecretVersionRequest.pb( service.AccessSecretVersionRequest() ) @@ -11330,6 +11425,10 @@ def test_access_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.AccessSecretVersionResponse() + post_with_metadata.return_value = ( + service.AccessSecretVersionResponse(), + metadata, + ) client.access_secret_version( request, @@ -11341,6 +11440,7 @@ def test_access_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_secret_version_rest_bad_request( @@ -11431,10 +11531,14 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_disable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_disable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_disable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DisableSecretVersionRequest.pb( service.DisableSecretVersionRequest() ) @@ -11458,6 +11562,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.disable_secret_version( request, @@ -11469,6 +11574,7 @@ def test_disable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_enable_secret_version_rest_bad_request( @@ -11559,10 +11665,14 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_enable_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_enable_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_enable_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.EnableSecretVersionRequest.pb( service.EnableSecretVersionRequest() ) @@ -11586,6 +11696,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.enable_secret_version( request, @@ -11597,6 +11708,7 @@ def test_enable_secret_version_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_destroy_secret_version_rest_bad_request( @@ -11687,10 +11799,14 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_destroy_secret_version" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_destroy_secret_version_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_destroy_secret_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service.DestroySecretVersionRequest.pb( service.DestroySecretVersionRequest() ) @@ -11714,6 +11830,7 @@ def test_destroy_secret_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.SecretVersion() + post_with_metadata.return_value = resources.SecretVersion(), metadata client.destroy_secret_version( request, @@ -11725,6 +11842,7 @@ def test_destroy_secret_version_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( @@ -11808,10 +11926,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11833,6 +11955,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -11844,6 +11967,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_rest_bad_request( @@ -11927,10 +12051,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11952,6 +12080,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -11963,6 +12092,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_rest_bad_request( @@ -12044,10 +12174,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecretManagerServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecretManagerServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -12071,6 +12205,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -12082,6 +12220,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/client.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/client.py index d3e271c23b75..d7597abb5c4e 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/client.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -635,6 +637,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2907,16 +2936,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2962,16 +2995,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -3194,16 +3231,20 @@ def set_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_iam_policy( self, @@ -3316,16 +3357,20 @@ def get_iam_policy( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def test_iam_permissions( self, @@ -3376,16 +3421,20 @@ def test_iam_permissions( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_location( self, @@ -3431,16 +3480,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3486,16 +3539,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest.py b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest.py index d8e051e3f7d9..684e0b755cb1 100644 --- a/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest.py +++ b/packages/google-cloud-securesourcemanager/google/cloud/securesourcemanager_v1/services/secure_source_manager/transports/rest.py @@ -226,12 +226,35 @@ def post_create_branch_rule( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_branch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_branch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_create_branch_rule` interceptor runs + before the `post_create_branch_rule_with_metadata` interceptor. """ return response + def post_create_branch_rule_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_branch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_create_branch_rule_with_metadata` + interceptor in new development instead of the `post_create_branch_rule` interceptor. + When both interceptors are used, this `post_create_branch_rule_with_metadata` interceptor runs after the + `post_create_branch_rule` interceptor. The (possibly modified) response returned by + `post_create_branch_rule` will be passed to + `post_create_branch_rule_with_metadata`. + """ + return response, metadata + def pre_create_instance( self, request: secure_source_manager.CreateInstanceRequest, @@ -252,12 +275,35 @@ def post_create_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_create_instance` interceptor runs + before the `post_create_instance_with_metadata` interceptor. """ return response + def post_create_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_create_instance_with_metadata` + interceptor in new development instead of the `post_create_instance` interceptor. + When both interceptors are used, this `post_create_instance_with_metadata` interceptor runs after the + `post_create_instance` interceptor. The (possibly modified) response returned by + `post_create_instance` will be passed to + `post_create_instance_with_metadata`. + """ + return response, metadata + def pre_create_repository( self, request: secure_source_manager.CreateRepositoryRequest, @@ -278,12 +324,35 @@ def post_create_repository( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_create_repository` interceptor runs + before the `post_create_repository_with_metadata` interceptor. """ return response + def post_create_repository_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_create_repository_with_metadata` + interceptor in new development instead of the `post_create_repository` interceptor. + When both interceptors are used, this `post_create_repository_with_metadata` interceptor runs after the + `post_create_repository` interceptor. The (possibly modified) response returned by + `post_create_repository` will be passed to + `post_create_repository_with_metadata`. + """ + return response, metadata + def pre_delete_branch_rule( self, request: secure_source_manager.DeleteBranchRuleRequest, @@ -304,12 +373,35 @@ def post_delete_branch_rule( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_branch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_branch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_branch_rule` interceptor runs + before the `post_delete_branch_rule_with_metadata` interceptor. """ return response + def post_delete_branch_rule_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_branch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_delete_branch_rule_with_metadata` + interceptor in new development instead of the `post_delete_branch_rule` interceptor. + When both interceptors are used, this `post_delete_branch_rule_with_metadata` interceptor runs after the + `post_delete_branch_rule` interceptor. The (possibly modified) response returned by + `post_delete_branch_rule` will be passed to + `post_delete_branch_rule_with_metadata`. + """ + return response, metadata + def pre_delete_instance( self, request: secure_source_manager.DeleteInstanceRequest, @@ -330,12 +422,35 @@ def post_delete_instance( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_instance` interceptor runs + before the `post_delete_instance_with_metadata` interceptor. """ return response + def post_delete_instance_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_delete_instance_with_metadata` + interceptor in new development instead of the `post_delete_instance` interceptor. + When both interceptors are used, this `post_delete_instance_with_metadata` interceptor runs after the + `post_delete_instance` interceptor. The (possibly modified) response returned by + `post_delete_instance` will be passed to + `post_delete_instance_with_metadata`. + """ + return response, metadata + def pre_delete_repository( self, request: secure_source_manager.DeleteRepositoryRequest, @@ -356,12 +471,35 @@ def post_delete_repository( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_delete_repository` interceptor runs + before the `post_delete_repository_with_metadata` interceptor. """ return response + def post_delete_repository_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_delete_repository_with_metadata` + interceptor in new development instead of the `post_delete_repository` interceptor. + When both interceptors are used, this `post_delete_repository_with_metadata` interceptor runs after the + `post_delete_repository` interceptor. The (possibly modified) response returned by + `post_delete_repository` will be passed to + `post_delete_repository_with_metadata`. + """ + return response, metadata + def pre_get_branch_rule( self, request: secure_source_manager.GetBranchRuleRequest, @@ -382,12 +520,37 @@ def post_get_branch_rule( ) -> secure_source_manager.BranchRule: """Post-rpc interceptor for get_branch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_branch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_get_branch_rule` interceptor runs + before the `post_get_branch_rule_with_metadata` interceptor. """ return response + def post_get_branch_rule_with_metadata( + self, + response: secure_source_manager.BranchRule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + secure_source_manager.BranchRule, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_branch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_get_branch_rule_with_metadata` + interceptor in new development instead of the `post_get_branch_rule` interceptor. + When both interceptors are used, this `post_get_branch_rule_with_metadata` interceptor runs after the + `post_get_branch_rule` interceptor. The (possibly modified) response returned by + `post_get_branch_rule` will be passed to + `post_get_branch_rule_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy_repo( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -407,12 +570,35 @@ def post_get_iam_policy_repo( ) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy_repo - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_repo_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy_repo` interceptor runs + before the `post_get_iam_policy_repo_with_metadata` interceptor. """ return response + def post_get_iam_policy_repo_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy_repo + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_get_iam_policy_repo_with_metadata` + interceptor in new development instead of the `post_get_iam_policy_repo` interceptor. + When both interceptors are used, this `post_get_iam_policy_repo_with_metadata` interceptor runs after the + `post_get_iam_policy_repo` interceptor. The (possibly modified) response returned by + `post_get_iam_policy_repo` will be passed to + `post_get_iam_policy_repo_with_metadata`. + """ + return response, metadata + def pre_get_instance( self, request: secure_source_manager.GetInstanceRequest, @@ -433,12 +619,35 @@ def post_get_instance( ) -> secure_source_manager.Instance: """Post-rpc interceptor for get_instance - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_instance_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_get_instance` interceptor runs + before the `post_get_instance_with_metadata` interceptor. """ return response + def post_get_instance_with_metadata( + self, + response: secure_source_manager.Instance, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[secure_source_manager.Instance, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_instance + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_get_instance_with_metadata` + interceptor in new development instead of the `post_get_instance` interceptor. + When both interceptors are used, this `post_get_instance_with_metadata` interceptor runs after the + `post_get_instance` interceptor. The (possibly modified) response returned by + `post_get_instance` will be passed to + `post_get_instance_with_metadata`. + """ + return response, metadata + def pre_get_repository( self, request: secure_source_manager.GetRepositoryRequest, @@ -459,12 +668,37 @@ def post_get_repository( ) -> secure_source_manager.Repository: """Post-rpc interceptor for get_repository - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_repository_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_get_repository` interceptor runs + before the `post_get_repository_with_metadata` interceptor. """ return response + def post_get_repository_with_metadata( + self, + response: secure_source_manager.Repository, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + secure_source_manager.Repository, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_repository + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_get_repository_with_metadata` + interceptor in new development instead of the `post_get_repository` interceptor. + When both interceptors are used, this `post_get_repository_with_metadata` interceptor runs after the + `post_get_repository` interceptor. The (possibly modified) response returned by + `post_get_repository` will be passed to + `post_get_repository_with_metadata`. + """ + return response, metadata + def pre_list_branch_rules( self, request: secure_source_manager.ListBranchRulesRequest, @@ -485,12 +719,38 @@ def post_list_branch_rules( ) -> secure_source_manager.ListBranchRulesResponse: """Post-rpc interceptor for list_branch_rules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_branch_rules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_list_branch_rules` interceptor runs + before the `post_list_branch_rules_with_metadata` interceptor. """ return response + def post_list_branch_rules_with_metadata( + self, + response: secure_source_manager.ListBranchRulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + secure_source_manager.ListBranchRulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_branch_rules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_list_branch_rules_with_metadata` + interceptor in new development instead of the `post_list_branch_rules` interceptor. + When both interceptors are used, this `post_list_branch_rules_with_metadata` interceptor runs after the + `post_list_branch_rules` interceptor. The (possibly modified) response returned by + `post_list_branch_rules` will be passed to + `post_list_branch_rules_with_metadata`. + """ + return response, metadata + def pre_list_instances( self, request: secure_source_manager.ListInstancesRequest, @@ -511,12 +771,38 @@ def post_list_instances( ) -> secure_source_manager.ListInstancesResponse: """Post-rpc interceptor for list_instances - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_instances_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager 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: secure_source_manager.ListInstancesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + secure_source_manager.ListInstancesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_instances + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_list_instances_with_metadata` + interceptor in new development instead of the `post_list_instances` interceptor. + When both interceptors are used, this `post_list_instances_with_metadata` interceptor runs after the + `post_list_instances` interceptor. The (possibly modified) response returned by + `post_list_instances` will be passed to + `post_list_instances_with_metadata`. + """ + return response, metadata + def pre_list_repositories( self, request: secure_source_manager.ListRepositoriesRequest, @@ -537,12 +823,38 @@ def post_list_repositories( ) -> secure_source_manager.ListRepositoriesResponse: """Post-rpc interceptor for list_repositories - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_repositories_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_list_repositories` interceptor runs + before the `post_list_repositories_with_metadata` interceptor. """ return response + def post_list_repositories_with_metadata( + self, + response: secure_source_manager.ListRepositoriesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + secure_source_manager.ListRepositoriesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_repositories + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_list_repositories_with_metadata` + interceptor in new development instead of the `post_list_repositories` interceptor. + When both interceptors are used, this `post_list_repositories_with_metadata` interceptor runs after the + `post_list_repositories` interceptor. The (possibly modified) response returned by + `post_list_repositories` will be passed to + `post_list_repositories_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy_repo( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -562,12 +874,35 @@ def post_set_iam_policy_repo( ) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy_repo - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_repo_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy_repo` interceptor runs + before the `post_set_iam_policy_repo_with_metadata` interceptor. """ return response + def post_set_iam_policy_repo_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy_repo + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_repo_with_metadata` + interceptor in new development instead of the `post_set_iam_policy_repo` interceptor. + When both interceptors are used, this `post_set_iam_policy_repo_with_metadata` interceptor runs after the + `post_set_iam_policy_repo` interceptor. The (possibly modified) response returned by + `post_set_iam_policy_repo` will be passed to + `post_set_iam_policy_repo_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions_repo( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -588,12 +923,38 @@ def post_test_iam_permissions_repo( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions_repo - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_repo_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions_repo` interceptor runs + before the `post_test_iam_permissions_repo_with_metadata` interceptor. """ return response + def post_test_iam_permissions_repo_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions_repo + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_test_iam_permissions_repo_with_metadata` + interceptor in new development instead of the `post_test_iam_permissions_repo` interceptor. + When both interceptors are used, this `post_test_iam_permissions_repo_with_metadata` interceptor runs after the + `post_test_iam_permissions_repo` interceptor. The (possibly modified) response returned by + `post_test_iam_permissions_repo` will be passed to + `post_test_iam_permissions_repo_with_metadata`. + """ + return response, metadata + def pre_update_branch_rule( self, request: secure_source_manager.UpdateBranchRuleRequest, @@ -614,12 +975,35 @@ def post_update_branch_rule( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_branch_rule - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_branch_rule_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecureSourceManager server but before - it is returned to user code. + it is returned to user code. This `post_update_branch_rule` interceptor runs + before the `post_update_branch_rule_with_metadata` interceptor. """ return response + def post_update_branch_rule_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_branch_rule + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecureSourceManager server but before it is returned to user code. + + We recommend only using this `post_update_branch_rule_with_metadata` + interceptor in new development instead of the `post_update_branch_rule` interceptor. + When both interceptors are used, this `post_update_branch_rule_with_metadata` interceptor runs after the + `post_update_branch_rule` interceptor. The (possibly modified) response returned by + `post_update_branch_rule` will be passed to + `post_update_branch_rule_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1131,6 +1515,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_branch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_branch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1280,6 +1668,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1431,6 +1823,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1576,6 +1972,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_branch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_branch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1719,6 +2119,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1864,6 +2268,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2010,6 +2418,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_branch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_branch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2230,6 +2642,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_iam_policy_repo(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_iam_policy_repo_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2374,6 +2790,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_instance(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_instance_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2518,6 +2938,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_repository(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_repository_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2666,6 +3090,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_branch_rules(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_branch_rules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2810,6 +3238,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 @@ -2956,6 +3388,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_repositories(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_repositories_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3182,6 +3618,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_iam_policy_repo(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_iam_policy_repo_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3333,6 +3773,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_test_iam_permissions_repo(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_test_iam_permissions_repo_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3484,6 +3928,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_branch_rule(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_branch_rule_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json b/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json index 59e5fa2727c9..61b28fdc2e03 100644 --- a/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json +++ b/packages/google-cloud-securesourcemanager/samples/generated_samples/snippet_metadata_google.cloud.securesourcemanager.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securesourcemanager", - "version": "0.1.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securesourcemanager/tests/unit/gapic/securesourcemanager_v1/test_secure_source_manager.py b/packages/google-cloud-securesourcemanager/tests/unit/gapic/securesourcemanager_v1/test_secure_source_manager.py index 041910d28985..04711be28d71 100644 --- a/packages/google-cloud-securesourcemanager/tests/unit/gapic/securesourcemanager_v1/test_secure_source_manager.py +++ b/packages/google-cloud-securesourcemanager/tests/unit/gapic/securesourcemanager_v1/test_secure_source_manager.py @@ -78,6 +78,13 @@ ) from google.cloud.securesourcemanager_v1.types import secure_source_manager +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -351,6 +358,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SecureSourceManagerClient(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 = SecureSourceManagerClient(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", [ @@ -11647,10 +11697,14 @@ def test_list_instances_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_list_instances" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_list_instances_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_list_instances" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.ListInstancesRequest.pb( secure_source_manager.ListInstancesRequest() ) @@ -11676,6 +11730,10 @@ def test_list_instances_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.ListInstancesResponse() + post_with_metadata.return_value = ( + secure_source_manager.ListInstancesResponse(), + metadata, + ) client.list_instances( request, @@ -11687,6 +11745,7 @@ def test_list_instances_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_instance_rest_bad_request( @@ -11780,10 +11839,13 @@ def test_get_instance_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_get_instance" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, "post_get_instance_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_get_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.GetInstanceRequest.pb( secure_source_manager.GetInstanceRequest() ) @@ -11809,6 +11871,7 @@ def test_get_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.Instance() + post_with_metadata.return_value = secure_source_manager.Instance(), metadata client.get_instance( request, @@ -11820,6 +11883,7 @@ def test_get_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_instance_rest_bad_request( @@ -11992,10 +12056,14 @@ def test_create_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_create_instance" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_create_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_create_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.CreateInstanceRequest.pb( secure_source_manager.CreateInstanceRequest() ) @@ -12019,6 +12087,7 @@ def test_create_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_instance( request, @@ -12030,6 +12099,7 @@ def test_create_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_instance_rest_bad_request( @@ -12110,10 +12180,14 @@ def test_delete_instance_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_delete_instance" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_delete_instance_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_delete_instance" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.DeleteInstanceRequest.pb( secure_source_manager.DeleteInstanceRequest() ) @@ -12137,6 +12211,7 @@ def test_delete_instance_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_instance( request, @@ -12148,6 +12223,7 @@ def test_delete_instance_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_repositories_rest_bad_request( @@ -12232,10 +12308,14 @@ def test_list_repositories_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_list_repositories" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_list_repositories_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_list_repositories" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.ListRepositoriesRequest.pb( secure_source_manager.ListRepositoriesRequest() ) @@ -12261,6 +12341,10 @@ def test_list_repositories_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.ListRepositoriesResponse() + post_with_metadata.return_value = ( + secure_source_manager.ListRepositoriesResponse(), + metadata, + ) client.list_repositories( request, @@ -12272,6 +12356,7 @@ def test_list_repositories_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_repository_rest_bad_request( @@ -12364,10 +12449,14 @@ def test_get_repository_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_get_repository" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_get_repository_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_get_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.GetRepositoryRequest.pb( secure_source_manager.GetRepositoryRequest() ) @@ -12393,6 +12482,7 @@ def test_get_repository_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.Repository() + post_with_metadata.return_value = secure_source_manager.Repository(), metadata client.get_repository( request, @@ -12404,6 +12494,7 @@ def test_get_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_repository_rest_bad_request( @@ -12571,10 +12662,14 @@ def test_create_repository_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_create_repository" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_create_repository_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_create_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.CreateRepositoryRequest.pb( secure_source_manager.CreateRepositoryRequest() ) @@ -12598,6 +12693,7 @@ def test_create_repository_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_repository( request, @@ -12609,6 +12705,7 @@ def test_create_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_repository_rest_bad_request( @@ -12689,10 +12786,14 @@ def test_delete_repository_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_delete_repository" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_delete_repository_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_delete_repository" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.DeleteRepositoryRequest.pb( secure_source_manager.DeleteRepositoryRequest() ) @@ -12716,6 +12817,7 @@ def test_delete_repository_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_repository( request, @@ -12727,6 +12829,7 @@ def test_delete_repository_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_iam_policy_repo_rest_bad_request( @@ -12814,10 +12917,14 @@ def test_get_iam_policy_repo_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_get_iam_policy_repo" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_get_iam_policy_repo_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_get_iam_policy_repo" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -12839,6 +12946,7 @@ def test_get_iam_policy_repo_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy_repo( request, @@ -12850,6 +12958,7 @@ def test_get_iam_policy_repo_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_repo_rest_bad_request( @@ -12937,10 +13046,14 @@ def test_set_iam_policy_repo_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_set_iam_policy_repo" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_set_iam_policy_repo_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_set_iam_policy_repo" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -12962,6 +13075,7 @@ def test_set_iam_policy_repo_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy_repo( request, @@ -12973,6 +13087,7 @@ def test_set_iam_policy_repo_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_test_iam_permissions_repo_rest_bad_request( @@ -13058,10 +13173,14 @@ def test_test_iam_permissions_repo_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_test_iam_permissions_repo" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_test_iam_permissions_repo_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_test_iam_permissions_repo" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -13085,6 +13204,10 @@ def test_test_iam_permissions_repo_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions_repo( request, @@ -13096,6 +13219,7 @@ def test_test_iam_permissions_repo_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_branch_rule_rest_bad_request( @@ -13262,10 +13386,14 @@ def test_create_branch_rule_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_create_branch_rule" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_create_branch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_create_branch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.CreateBranchRuleRequest.pb( secure_source_manager.CreateBranchRuleRequest() ) @@ -13289,6 +13417,7 @@ def test_create_branch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_branch_rule( request, @@ -13300,6 +13429,7 @@ def test_create_branch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_branch_rules_rest_bad_request( @@ -13384,10 +13514,14 @@ def test_list_branch_rules_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_list_branch_rules" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_list_branch_rules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_list_branch_rules" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.ListBranchRulesRequest.pb( secure_source_manager.ListBranchRulesRequest() ) @@ -13413,6 +13547,10 @@ def test_list_branch_rules_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.ListBranchRulesResponse() + post_with_metadata.return_value = ( + secure_source_manager.ListBranchRulesResponse(), + metadata, + ) client.list_branch_rules( request, @@ -13424,6 +13562,7 @@ def test_list_branch_rules_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_branch_rule_rest_bad_request( @@ -13532,10 +13671,14 @@ def test_get_branch_rule_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_get_branch_rule" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_get_branch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_get_branch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.GetBranchRuleRequest.pb( secure_source_manager.GetBranchRuleRequest() ) @@ -13561,6 +13704,7 @@ def test_get_branch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = secure_source_manager.BranchRule() + post_with_metadata.return_value = secure_source_manager.BranchRule(), metadata client.get_branch_rule( request, @@ -13572,6 +13716,7 @@ def test_get_branch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_branch_rule_rest_bad_request( @@ -13746,10 +13891,14 @@ def test_update_branch_rule_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_update_branch_rule" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_update_branch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_update_branch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.UpdateBranchRuleRequest.pb( secure_source_manager.UpdateBranchRuleRequest() ) @@ -13773,6 +13922,7 @@ def test_update_branch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_branch_rule( request, @@ -13784,6 +13934,7 @@ def test_update_branch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_branch_rule_rest_bad_request( @@ -13868,10 +14019,14 @@ def test_delete_branch_rule_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecureSourceManagerRestInterceptor, "post_delete_branch_rule" ) as post, mock.patch.object( + transports.SecureSourceManagerRestInterceptor, + "post_delete_branch_rule_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecureSourceManagerRestInterceptor, "pre_delete_branch_rule" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = secure_source_manager.DeleteBranchRuleRequest.pb( secure_source_manager.DeleteBranchRuleRequest() ) @@ -13895,6 +14050,7 @@ def test_delete_branch_rule_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_branch_rule( request, @@ -13906,6 +14062,7 @@ def test_delete_branch_rule_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py index ed461d017338..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.36.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py index ed461d017338..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.36.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/client.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/client.py index 065d5d806c79..ac226fcfc9ed 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/client.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/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 @@ -975,6 +977,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. @@ -9201,16 +9230,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -9256,16 +9289,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/transports/rest.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/transports/rest.py index 7a5837104048..617305798cb9 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/transports/rest.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1/services/security_center/transports/rest.py @@ -612,12 +612,38 @@ def post_batch_create_resource_value_configs( ) -> securitycenter_service.BatchCreateResourceValueConfigsResponse: """Post-rpc interceptor for batch_create_resource_value_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_resource_value_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_resource_value_configs` interceptor runs + before the `post_batch_create_resource_value_configs_with_metadata` interceptor. """ return response + def post_batch_create_resource_value_configs_with_metadata( + self, + response: securitycenter_service.BatchCreateResourceValueConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.BatchCreateResourceValueConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_create_resource_value_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_batch_create_resource_value_configs_with_metadata` + interceptor in new development instead of the `post_batch_create_resource_value_configs` interceptor. + When both interceptors are used, this `post_batch_create_resource_value_configs_with_metadata` interceptor runs after the + `post_batch_create_resource_value_configs` interceptor. The (possibly modified) response returned by + `post_batch_create_resource_value_configs` will be passed to + `post_batch_create_resource_value_configs_with_metadata`. + """ + return response, metadata + def pre_bulk_mute_findings( self, request: securitycenter_service.BulkMuteFindingsRequest, @@ -638,12 +664,35 @@ def post_bulk_mute_findings( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_mute_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_mute_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_bulk_mute_findings` interceptor runs + before the `post_bulk_mute_findings_with_metadata` interceptor. """ return response + def post_bulk_mute_findings_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_mute_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_bulk_mute_findings_with_metadata` + interceptor in new development instead of the `post_bulk_mute_findings` interceptor. + When both interceptors are used, this `post_bulk_mute_findings_with_metadata` interceptor runs after the + `post_bulk_mute_findings` interceptor. The (possibly modified) response returned by + `post_bulk_mute_findings` will be passed to + `post_bulk_mute_findings_with_metadata`. + """ + return response, metadata + def pre_create_big_query_export( self, request: securitycenter_service.CreateBigQueryExportRequest, @@ -664,12 +713,35 @@ def post_create_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for create_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_big_query_export` interceptor runs + before the `post_create_big_query_export_with_metadata` interceptor. """ return response + def post_create_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_big_query_export_with_metadata` + interceptor in new development instead of the `post_create_big_query_export` interceptor. + When both interceptors are used, this `post_create_big_query_export_with_metadata` interceptor runs after the + `post_create_big_query_export` interceptor. The (possibly modified) response returned by + `post_create_big_query_export` will be passed to + `post_create_big_query_export_with_metadata`. + """ + return response, metadata + def pre_create_event_threat_detection_custom_module( self, request: securitycenter_service.CreateEventThreatDetectionCustomModuleRequest, @@ -691,12 +763,38 @@ def post_create_event_threat_detection_custom_module( ) -> gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule: """Post-rpc interceptor for create_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_event_threat_detection_custom_module` interceptor runs + before the `post_create_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_create_event_threat_detection_custom_module_with_metadata( + self, + response: gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_create_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_create_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_create_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_create_event_threat_detection_custom_module` will be passed to + `post_create_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_create_finding( self, request: securitycenter_service.CreateFindingRequest, @@ -715,12 +813,35 @@ def pre_create_finding( def post_create_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for create_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_finding` interceptor runs + before the `post_create_finding_with_metadata` interceptor. """ return response + def post_create_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_finding_with_metadata` + interceptor in new development instead of the `post_create_finding` interceptor. + When both interceptors are used, this `post_create_finding_with_metadata` interceptor runs after the + `post_create_finding` interceptor. The (possibly modified) response returned by + `post_create_finding` will be passed to + `post_create_finding_with_metadata`. + """ + return response, metadata + def pre_create_mute_config( self, request: securitycenter_service.CreateMuteConfigRequest, @@ -741,12 +862,35 @@ def post_create_mute_config( ) -> gcs_mute_config.MuteConfig: """Post-rpc interceptor for create_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_mute_config` interceptor runs + before the `post_create_mute_config_with_metadata` interceptor. """ return response + def post_create_mute_config_with_metadata( + self, + response: gcs_mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_mute_config_with_metadata` + interceptor in new development instead of the `post_create_mute_config` interceptor. + When both interceptors are used, this `post_create_mute_config_with_metadata` interceptor runs after the + `post_create_mute_config` interceptor. The (possibly modified) response returned by + `post_create_mute_config` will be passed to + `post_create_mute_config_with_metadata`. + """ + return response, metadata + def pre_create_notification_config( self, request: securitycenter_service.CreateNotificationConfigRequest, @@ -767,12 +911,38 @@ def post_create_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for create_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_notification_config` interceptor runs + before the `post_create_notification_config_with_metadata` interceptor. """ return response + def post_create_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_notification_config_with_metadata` + interceptor in new development instead of the `post_create_notification_config` interceptor. + When both interceptors are used, this `post_create_notification_config_with_metadata` interceptor runs after the + `post_create_notification_config` interceptor. The (possibly modified) response returned by + `post_create_notification_config` will be passed to + `post_create_notification_config_with_metadata`. + """ + return response, metadata + def pre_create_security_health_analytics_custom_module( self, request: securitycenter_service.CreateSecurityHealthAnalyticsCustomModuleRequest, @@ -796,12 +966,38 @@ def post_create_security_health_analytics_custom_module( ): """Post-rpc interceptor for create_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_security_health_analytics_custom_module` interceptor runs + before the `post_create_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_create_security_health_analytics_custom_module_with_metadata( + self, + response: gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_create_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_create_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_create_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_create_security_health_analytics_custom_module` will be passed to + `post_create_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_create_source( self, request: securitycenter_service.CreateSourceRequest, @@ -820,12 +1016,35 @@ def pre_create_source( def post_create_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for create_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_source` interceptor runs + before the `post_create_source_with_metadata` interceptor. """ return response + def post_create_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_source_with_metadata` + interceptor in new development instead of the `post_create_source` interceptor. + When both interceptors are used, this `post_create_source_with_metadata` interceptor runs after the + `post_create_source` interceptor. The (possibly modified) response returned by + `post_create_source` will be passed to + `post_create_source_with_metadata`. + """ + return response, metadata + def pre_delete_big_query_export( self, request: securitycenter_service.DeleteBigQueryExportRequest, @@ -936,12 +1155,35 @@ def post_get_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for get_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_big_query_export` interceptor runs + before the `post_get_big_query_export_with_metadata` interceptor. """ return response + def post_get_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_big_query_export_with_metadata` + interceptor in new development instead of the `post_get_big_query_export` interceptor. + When both interceptors are used, this `post_get_big_query_export_with_metadata` interceptor runs after the + `post_get_big_query_export` interceptor. The (possibly modified) response returned by + `post_get_big_query_export` will be passed to + `post_get_big_query_export_with_metadata`. + """ + return response, metadata + def pre_get_effective_event_threat_detection_custom_module( self, request: securitycenter_service.GetEffectiveEventThreatDetectionCustomModuleRequest, @@ -965,12 +1207,38 @@ def post_get_effective_event_threat_detection_custom_module( ): """Post-rpc interceptor for get_effective_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_event_threat_detection_custom_module` interceptor runs + before the `post_get_effective_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_get_effective_event_threat_detection_custom_module_with_metadata( + self, + response: effective_event_threat_detection_custom_module.EffectiveEventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + effective_event_threat_detection_custom_module.EffectiveEventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_effective_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_get_effective_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_get_effective_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_get_effective_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_get_effective_event_threat_detection_custom_module` will be passed to + `post_get_effective_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_effective_security_health_analytics_custom_module( self, request: securitycenter_service.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest, @@ -994,12 +1262,38 @@ def post_get_effective_security_health_analytics_custom_module( ): """Post-rpc interceptor for get_effective_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_security_health_analytics_custom_module` interceptor runs + before the `post_get_effective_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_get_effective_security_health_analytics_custom_module_with_metadata( + self, + response: effective_security_health_analytics_custom_module.EffectiveSecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + effective_security_health_analytics_custom_module.EffectiveSecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_effective_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_get_effective_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_get_effective_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_get_effective_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_get_effective_security_health_analytics_custom_module` will be passed to + `post_get_effective_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_event_threat_detection_custom_module( self, request: securitycenter_service.GetEventThreatDetectionCustomModuleRequest, @@ -1021,12 +1315,38 @@ def post_get_event_threat_detection_custom_module( ) -> event_threat_detection_custom_module.EventThreatDetectionCustomModule: """Post-rpc interceptor for get_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_event_threat_detection_custom_module` interceptor runs + before the `post_get_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_get_event_threat_detection_custom_module_with_metadata( + self, + response: event_threat_detection_custom_module.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_threat_detection_custom_module.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_get_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_get_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_get_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_get_event_threat_detection_custom_module` will be passed to + `post_get_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -1044,12 +1364,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_mute_config( self, request: securitycenter_service.GetMuteConfigRequest, @@ -1070,12 +1413,35 @@ def post_get_mute_config( ) -> mute_config.MuteConfig: """Post-rpc interceptor for get_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_mute_config` interceptor runs + before the `post_get_mute_config_with_metadata` interceptor. """ return response + def post_get_mute_config_with_metadata( + self, + response: mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_mute_config_with_metadata` + interceptor in new development instead of the `post_get_mute_config` interceptor. + When both interceptors are used, this `post_get_mute_config_with_metadata` interceptor runs after the + `post_get_mute_config` interceptor. The (possibly modified) response returned by + `post_get_mute_config` will be passed to + `post_get_mute_config_with_metadata`. + """ + return response, metadata + def pre_get_notification_config( self, request: securitycenter_service.GetNotificationConfigRequest, @@ -1096,12 +1462,37 @@ def post_get_notification_config( ) -> notification_config.NotificationConfig: """Post-rpc interceptor for get_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_notification_config` interceptor runs + before the `post_get_notification_config_with_metadata` interceptor. """ return response + def post_get_notification_config_with_metadata( + self, + response: notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + notification_config.NotificationConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_notification_config_with_metadata` + interceptor in new development instead of the `post_get_notification_config` interceptor. + When both interceptors are used, this `post_get_notification_config_with_metadata` interceptor runs after the + `post_get_notification_config` interceptor. The (possibly modified) response returned by + `post_get_notification_config` will be passed to + `post_get_notification_config_with_metadata`. + """ + return response, metadata + def pre_get_organization_settings( self, request: securitycenter_service.GetOrganizationSettingsRequest, @@ -1122,12 +1513,38 @@ def post_get_organization_settings( ) -> organization_settings.OrganizationSettings: """Post-rpc interceptor for get_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_organization_settings` interceptor runs + before the `post_get_organization_settings_with_metadata` interceptor. """ return response + def post_get_organization_settings_with_metadata( + self, + response: organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_organization_settings_with_metadata` + interceptor in new development instead of the `post_get_organization_settings` interceptor. + When both interceptors are used, this `post_get_organization_settings_with_metadata` interceptor runs after the + `post_get_organization_settings` interceptor. The (possibly modified) response returned by + `post_get_organization_settings` will be passed to + `post_get_organization_settings_with_metadata`. + """ + return response, metadata + def pre_get_resource_value_config( self, request: securitycenter_service.GetResourceValueConfigRequest, @@ -1148,12 +1565,38 @@ def post_get_resource_value_config( ) -> resource_value_config.ResourceValueConfig: """Post-rpc interceptor for get_resource_value_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_resource_value_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_resource_value_config` interceptor runs + before the `post_get_resource_value_config_with_metadata` interceptor. """ return response + def post_get_resource_value_config_with_metadata( + self, + response: resource_value_config.ResourceValueConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + resource_value_config.ResourceValueConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_resource_value_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_resource_value_config_with_metadata` + interceptor in new development instead of the `post_get_resource_value_config` interceptor. + When both interceptors are used, this `post_get_resource_value_config_with_metadata` interceptor runs after the + `post_get_resource_value_config` interceptor. The (possibly modified) response returned by + `post_get_resource_value_config` will be passed to + `post_get_resource_value_config_with_metadata`. + """ + return response, metadata + def pre_get_security_health_analytics_custom_module( self, request: securitycenter_service.GetSecurityHealthAnalyticsCustomModuleRequest, @@ -1175,12 +1618,38 @@ def post_get_security_health_analytics_custom_module( ) -> security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule: """Post-rpc interceptor for get_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_security_health_analytics_custom_module` interceptor runs + before the `post_get_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_get_security_health_analytics_custom_module_with_metadata( + self, + response: security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_get_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_get_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_get_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_get_security_health_analytics_custom_module` will be passed to + `post_get_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_simulation( self, request: securitycenter_service.GetSimulationRequest, @@ -1201,12 +1670,35 @@ def post_get_simulation( ) -> simulation.Simulation: """Post-rpc interceptor for get_simulation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_simulation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_simulation` interceptor runs + before the `post_get_simulation_with_metadata` interceptor. """ return response + def post_get_simulation_with_metadata( + self, + response: simulation.Simulation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[simulation.Simulation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_simulation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_simulation_with_metadata` + interceptor in new development instead of the `post_get_simulation` interceptor. + When both interceptors are used, this `post_get_simulation_with_metadata` interceptor runs after the + `post_get_simulation` interceptor. The (possibly modified) response returned by + `post_get_simulation` will be passed to + `post_get_simulation_with_metadata`. + """ + return response, metadata + def pre_get_source( self, request: securitycenter_service.GetSourceRequest, @@ -1224,12 +1716,33 @@ def pre_get_source( def post_get_source(self, response: source.Source) -> source.Source: """Post-rpc interceptor for get_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_source` interceptor runs + before the `post_get_source_with_metadata` interceptor. """ return response + def post_get_source_with_metadata( + self, response: source.Source, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_source_with_metadata` + interceptor in new development instead of the `post_get_source` interceptor. + When both interceptors are used, this `post_get_source_with_metadata` interceptor runs after the + `post_get_source` interceptor. The (possibly modified) response returned by + `post_get_source` will be passed to + `post_get_source_with_metadata`. + """ + return response, metadata + def pre_get_valued_resource( self, request: securitycenter_service.GetValuedResourceRequest, @@ -1250,12 +1763,35 @@ def post_get_valued_resource( ) -> valued_resource.ValuedResource: """Post-rpc interceptor for get_valued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_valued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_valued_resource` interceptor runs + before the `post_get_valued_resource_with_metadata` interceptor. """ return response + def post_get_valued_resource_with_metadata( + self, + response: valued_resource.ValuedResource, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[valued_resource.ValuedResource, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_valued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_valued_resource_with_metadata` + interceptor in new development instead of the `post_get_valued_resource` interceptor. + When both interceptors are used, this `post_get_valued_resource_with_metadata` interceptor runs after the + `post_get_valued_resource` interceptor. The (possibly modified) response returned by + `post_get_valued_resource` will be passed to + `post_get_valued_resource_with_metadata`. + """ + return response, metadata + def pre_group_assets( self, request: securitycenter_service.GroupAssetsRequest, @@ -1276,12 +1812,38 @@ def post_group_assets( ) -> securitycenter_service.GroupAssetsResponse: """Post-rpc interceptor for group_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_assets` interceptor runs + before the `post_group_assets_with_metadata` interceptor. """ return response + def post_group_assets_with_metadata( + self, + response: securitycenter_service.GroupAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_assets_with_metadata` + interceptor in new development instead of the `post_group_assets` interceptor. + When both interceptors are used, this `post_group_assets_with_metadata` interceptor runs after the + `post_group_assets` interceptor. The (possibly modified) response returned by + `post_group_assets` will be passed to + `post_group_assets_with_metadata`. + """ + return response, metadata + def pre_group_findings( self, request: securitycenter_service.GroupFindingsRequest, @@ -1302,12 +1864,38 @@ def post_group_findings( ) -> securitycenter_service.GroupFindingsResponse: """Post-rpc interceptor for group_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_findings` interceptor runs + before the `post_group_findings_with_metadata` interceptor. """ return response + def post_group_findings_with_metadata( + self, + response: securitycenter_service.GroupFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_findings_with_metadata` + interceptor in new development instead of the `post_group_findings` interceptor. + When both interceptors are used, this `post_group_findings_with_metadata` interceptor runs after the + `post_group_findings` interceptor. The (possibly modified) response returned by + `post_group_findings` will be passed to + `post_group_findings_with_metadata`. + """ + return response, metadata + def pre_list_assets( self, request: securitycenter_service.ListAssetsRequest, @@ -1328,12 +1916,38 @@ def post_list_assets( ) -> securitycenter_service.ListAssetsResponse: """Post-rpc interceptor for list_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_assets` interceptor runs + before the `post_list_assets_with_metadata` interceptor. """ return response + def post_list_assets_with_metadata( + self, + response: securitycenter_service.ListAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_assets_with_metadata` + interceptor in new development instead of the `post_list_assets` interceptor. + When both interceptors are used, this `post_list_assets_with_metadata` interceptor runs after the + `post_list_assets` interceptor. The (possibly modified) response returned by + `post_list_assets` will be passed to + `post_list_assets_with_metadata`. + """ + return response, metadata + def pre_list_attack_paths( self, request: securitycenter_service.ListAttackPathsRequest, @@ -1354,12 +1968,38 @@ def post_list_attack_paths( ) -> securitycenter_service.ListAttackPathsResponse: """Post-rpc interceptor for list_attack_paths - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attack_paths_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_attack_paths` interceptor runs + before the `post_list_attack_paths_with_metadata` interceptor. """ return response + def post_list_attack_paths_with_metadata( + self, + response: securitycenter_service.ListAttackPathsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListAttackPathsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_attack_paths + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_attack_paths_with_metadata` + interceptor in new development instead of the `post_list_attack_paths` interceptor. + When both interceptors are used, this `post_list_attack_paths_with_metadata` interceptor runs after the + `post_list_attack_paths` interceptor. The (possibly modified) response returned by + `post_list_attack_paths` will be passed to + `post_list_attack_paths_with_metadata`. + """ + return response, metadata + def pre_list_big_query_exports( self, request: securitycenter_service.ListBigQueryExportsRequest, @@ -1380,12 +2020,38 @@ def post_list_big_query_exports( ) -> securitycenter_service.ListBigQueryExportsResponse: """Post-rpc interceptor for list_big_query_exports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_big_query_exports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_big_query_exports` interceptor runs + before the `post_list_big_query_exports_with_metadata` interceptor. """ return response + def post_list_big_query_exports_with_metadata( + self, + response: securitycenter_service.ListBigQueryExportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListBigQueryExportsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_big_query_exports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_big_query_exports_with_metadata` + interceptor in new development instead of the `post_list_big_query_exports` interceptor. + When both interceptors are used, this `post_list_big_query_exports_with_metadata` interceptor runs after the + `post_list_big_query_exports` interceptor. The (possibly modified) response returned by + `post_list_big_query_exports` will be passed to + `post_list_big_query_exports_with_metadata`. + """ + return response, metadata + def pre_list_descendant_event_threat_detection_custom_modules( self, request: securitycenter_service.ListDescendantEventThreatDetectionCustomModulesRequest, @@ -1407,12 +2073,38 @@ def post_list_descendant_event_threat_detection_custom_modules( ) -> securitycenter_service.ListDescendantEventThreatDetectionCustomModulesResponse: """Post-rpc interceptor for list_descendant_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_descendant_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_descendant_event_threat_detection_custom_modules` interceptor runs + before the `post_list_descendant_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_descendant_event_threat_detection_custom_modules_with_metadata( + self, + response: securitycenter_service.ListDescendantEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListDescendantEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_descendant_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_descendant_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_descendant_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_descendant_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_descendant_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_descendant_event_threat_detection_custom_modules` will be passed to + `post_list_descendant_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_descendant_security_health_analytics_custom_modules( self, request: securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesRequest, @@ -1436,12 +2128,38 @@ def post_list_descendant_security_health_analytics_custom_modules( ): """Post-rpc interceptor for list_descendant_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_descendant_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_descendant_security_health_analytics_custom_modules` interceptor runs + before the `post_list_descendant_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_descendant_security_health_analytics_custom_modules_with_metadata( + self, + response: securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_descendant_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_descendant_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_descendant_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_descendant_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_descendant_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_descendant_security_health_analytics_custom_modules` will be passed to + `post_list_descendant_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_effective_event_threat_detection_custom_modules( self, request: securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesRequest, @@ -1463,12 +2181,38 @@ def post_list_effective_event_threat_detection_custom_modules( ) -> securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesResponse: """Post-rpc interceptor for list_effective_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_effective_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_effective_event_threat_detection_custom_modules` interceptor runs + before the `post_list_effective_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_effective_event_threat_detection_custom_modules_with_metadata( + self, + response: securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_effective_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_effective_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_effective_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_effective_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_effective_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_effective_event_threat_detection_custom_modules` will be passed to + `post_list_effective_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_effective_security_health_analytics_custom_modules( self, request: securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest, @@ -1492,12 +2236,38 @@ def post_list_effective_security_health_analytics_custom_modules( ): """Post-rpc interceptor for list_effective_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_effective_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_effective_security_health_analytics_custom_modules` interceptor runs + before the `post_list_effective_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_effective_security_health_analytics_custom_modules_with_metadata( + self, + response: securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_effective_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_effective_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_effective_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_effective_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_effective_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_effective_security_health_analytics_custom_modules` will be passed to + `post_list_effective_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_event_threat_detection_custom_modules( self, request: securitycenter_service.ListEventThreatDetectionCustomModulesRequest, @@ -1519,12 +2289,38 @@ def post_list_event_threat_detection_custom_modules( ) -> securitycenter_service.ListEventThreatDetectionCustomModulesResponse: """Post-rpc interceptor for list_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_event_threat_detection_custom_modules` interceptor runs + before the `post_list_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_event_threat_detection_custom_modules_with_metadata( + self, + response: securitycenter_service.ListEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_event_threat_detection_custom_modules` will be passed to + `post_list_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_findings( self, request: securitycenter_service.ListFindingsRequest, @@ -1545,12 +2341,38 @@ def post_list_findings( ) -> securitycenter_service.ListFindingsResponse: """Post-rpc interceptor for list_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_findings` interceptor runs + before the `post_list_findings_with_metadata` interceptor. """ return response + def post_list_findings_with_metadata( + self, + response: securitycenter_service.ListFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_findings_with_metadata` + interceptor in new development instead of the `post_list_findings` interceptor. + When both interceptors are used, this `post_list_findings_with_metadata` interceptor runs after the + `post_list_findings` interceptor. The (possibly modified) response returned by + `post_list_findings` will be passed to + `post_list_findings_with_metadata`. + """ + return response, metadata + def pre_list_mute_configs( self, request: securitycenter_service.ListMuteConfigsRequest, @@ -1571,12 +2393,38 @@ def post_list_mute_configs( ) -> securitycenter_service.ListMuteConfigsResponse: """Post-rpc interceptor for list_mute_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_mute_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_mute_configs` interceptor runs + before the `post_list_mute_configs_with_metadata` interceptor. """ return response + def post_list_mute_configs_with_metadata( + self, + response: securitycenter_service.ListMuteConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListMuteConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_mute_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_mute_configs_with_metadata` + interceptor in new development instead of the `post_list_mute_configs` interceptor. + When both interceptors are used, this `post_list_mute_configs_with_metadata` interceptor runs after the + `post_list_mute_configs` interceptor. The (possibly modified) response returned by + `post_list_mute_configs` will be passed to + `post_list_mute_configs_with_metadata`. + """ + return response, metadata + def pre_list_notification_configs( self, request: securitycenter_service.ListNotificationConfigsRequest, @@ -1597,12 +2445,38 @@ def post_list_notification_configs( ) -> securitycenter_service.ListNotificationConfigsResponse: """Post-rpc interceptor for list_notification_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_notification_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_notification_configs` interceptor runs + before the `post_list_notification_configs_with_metadata` interceptor. """ return response + def post_list_notification_configs_with_metadata( + self, + response: securitycenter_service.ListNotificationConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListNotificationConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_notification_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_notification_configs_with_metadata` + interceptor in new development instead of the `post_list_notification_configs` interceptor. + When both interceptors are used, this `post_list_notification_configs_with_metadata` interceptor runs after the + `post_list_notification_configs` interceptor. The (possibly modified) response returned by + `post_list_notification_configs` will be passed to + `post_list_notification_configs_with_metadata`. + """ + return response, metadata + def pre_list_resource_value_configs( self, request: securitycenter_service.ListResourceValueConfigsRequest, @@ -1623,12 +2497,38 @@ def post_list_resource_value_configs( ) -> securitycenter_service.ListResourceValueConfigsResponse: """Post-rpc interceptor for list_resource_value_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_resource_value_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_resource_value_configs` interceptor runs + before the `post_list_resource_value_configs_with_metadata` interceptor. """ return response + def post_list_resource_value_configs_with_metadata( + self, + response: securitycenter_service.ListResourceValueConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListResourceValueConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_resource_value_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_resource_value_configs_with_metadata` + interceptor in new development instead of the `post_list_resource_value_configs` interceptor. + When both interceptors are used, this `post_list_resource_value_configs_with_metadata` interceptor runs after the + `post_list_resource_value_configs` interceptor. The (possibly modified) response returned by + `post_list_resource_value_configs` will be passed to + `post_list_resource_value_configs_with_metadata`. + """ + return response, metadata + def pre_list_security_health_analytics_custom_modules( self, request: securitycenter_service.ListSecurityHealthAnalyticsCustomModulesRequest, @@ -1650,12 +2550,38 @@ def post_list_security_health_analytics_custom_modules( ) -> securitycenter_service.ListSecurityHealthAnalyticsCustomModulesResponse: """Post-rpc interceptor for list_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_security_health_analytics_custom_modules` interceptor runs + before the `post_list_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_security_health_analytics_custom_modules_with_metadata( + self, + response: securitycenter_service.ListSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_security_health_analytics_custom_modules` will be passed to + `post_list_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_sources( self, request: securitycenter_service.ListSourcesRequest, @@ -1676,12 +2602,38 @@ def post_list_sources( ) -> securitycenter_service.ListSourcesResponse: """Post-rpc interceptor for list_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_sources` interceptor runs + before the `post_list_sources_with_metadata` interceptor. """ return response + def post_list_sources_with_metadata( + self, + response: securitycenter_service.ListSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListSourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_sources_with_metadata` + interceptor in new development instead of the `post_list_sources` interceptor. + When both interceptors are used, this `post_list_sources_with_metadata` interceptor runs after the + `post_list_sources` interceptor. The (possibly modified) response returned by + `post_list_sources` will be passed to + `post_list_sources_with_metadata`. + """ + return response, metadata + def pre_list_valued_resources( self, request: securitycenter_service.ListValuedResourcesRequest, @@ -1702,12 +2654,38 @@ def post_list_valued_resources( ) -> securitycenter_service.ListValuedResourcesResponse: """Post-rpc interceptor for list_valued_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_valued_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_valued_resources` interceptor runs + before the `post_list_valued_resources_with_metadata` interceptor. """ return response + def post_list_valued_resources_with_metadata( + self, + response: securitycenter_service.ListValuedResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListValuedResourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_valued_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_valued_resources_with_metadata` + interceptor in new development instead of the `post_list_valued_resources` interceptor. + When both interceptors are used, this `post_list_valued_resources_with_metadata` interceptor runs after the + `post_list_valued_resources` interceptor. The (possibly modified) response returned by + `post_list_valued_resources` will be passed to + `post_list_valued_resources_with_metadata`. + """ + return response, metadata + def pre_run_asset_discovery( self, request: securitycenter_service.RunAssetDiscoveryRequest, @@ -1728,12 +2706,35 @@ def post_run_asset_discovery( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_asset_discovery - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_asset_discovery_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_run_asset_discovery` interceptor runs + before the `post_run_asset_discovery_with_metadata` interceptor. """ return response + def post_run_asset_discovery_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_asset_discovery + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_run_asset_discovery_with_metadata` + interceptor in new development instead of the `post_run_asset_discovery` interceptor. + When both interceptors are used, this `post_run_asset_discovery_with_metadata` interceptor runs after the + `post_run_asset_discovery` interceptor. The (possibly modified) response returned by + `post_run_asset_discovery` will be passed to + `post_run_asset_discovery_with_metadata`. + """ + return response, metadata + def pre_set_finding_state( self, request: securitycenter_service.SetFindingStateRequest, @@ -1752,12 +2753,35 @@ def pre_set_finding_state( def post_set_finding_state(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_finding_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_finding_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_finding_state` interceptor runs + before the `post_set_finding_state_with_metadata` interceptor. """ return response + def post_set_finding_state_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_finding_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_finding_state_with_metadata` + interceptor in new development instead of the `post_set_finding_state` interceptor. + When both interceptors are used, this `post_set_finding_state_with_metadata` interceptor runs after the + `post_set_finding_state` interceptor. The (possibly modified) response returned by + `post_set_finding_state` will be passed to + `post_set_finding_state_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -1775,12 +2799,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_mute( self, request: securitycenter_service.SetMuteRequest, @@ -1798,11 +2845,34 @@ def pre_set_mute( def post_set_mute(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_mute - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_mute_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_mute` interceptor runs + before the `post_set_mute_with_metadata` interceptor. + """ + return response + + def post_set_mute_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_mute + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_mute_with_metadata` + interceptor in new development instead of the `post_set_mute` interceptor. + When both interceptors are used, this `post_set_mute_with_metadata` interceptor runs after the + `post_set_mute` interceptor. The (possibly modified) response returned by + `post_set_mute` will be passed to + `post_set_mute_with_metadata`. """ - return response + return response, metadata def pre_simulate_security_health_analytics_custom_module( self, @@ -1825,12 +2895,38 @@ def post_simulate_security_health_analytics_custom_module( ) -> securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleResponse: """Post-rpc interceptor for simulate_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_simulate_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_simulate_security_health_analytics_custom_module` interceptor runs + before the `post_simulate_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_simulate_security_health_analytics_custom_module_with_metadata( + self, + response: securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for simulate_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_simulate_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_simulate_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_simulate_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_simulate_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_simulate_security_health_analytics_custom_module` will be passed to + `post_simulate_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -1851,12 +2947,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_big_query_export( self, request: securitycenter_service.UpdateBigQueryExportRequest, @@ -1877,12 +2999,35 @@ def post_update_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for update_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_big_query_export` interceptor runs + before the `post_update_big_query_export_with_metadata` interceptor. """ return response + def post_update_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_big_query_export_with_metadata` + interceptor in new development instead of the `post_update_big_query_export` interceptor. + When both interceptors are used, this `post_update_big_query_export_with_metadata` interceptor runs after the + `post_update_big_query_export` interceptor. The (possibly modified) response returned by + `post_update_big_query_export` will be passed to + `post_update_big_query_export_with_metadata`. + """ + return response, metadata + def pre_update_event_threat_detection_custom_module( self, request: securitycenter_service.UpdateEventThreatDetectionCustomModuleRequest, @@ -1904,12 +3049,38 @@ def post_update_event_threat_detection_custom_module( ) -> gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule: """Post-rpc interceptor for update_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_event_threat_detection_custom_module` interceptor runs + before the `post_update_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_update_event_threat_detection_custom_module_with_metadata( + self, + response: gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_update_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_update_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_update_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_update_event_threat_detection_custom_module` will be passed to + `post_update_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_update_external_system( self, request: securitycenter_service.UpdateExternalSystemRequest, @@ -1930,12 +3101,37 @@ def post_update_external_system( ) -> gcs_external_system.ExternalSystem: """Post-rpc interceptor for update_external_system - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_external_system_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_external_system` interceptor runs + before the `post_update_external_system_with_metadata` interceptor. """ return response + def post_update_external_system_with_metadata( + self, + response: gcs_external_system.ExternalSystem, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_external_system.ExternalSystem, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_external_system + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_external_system_with_metadata` + interceptor in new development instead of the `post_update_external_system` interceptor. + When both interceptors are used, this `post_update_external_system_with_metadata` interceptor runs after the + `post_update_external_system` interceptor. The (possibly modified) response returned by + `post_update_external_system` will be passed to + `post_update_external_system_with_metadata`. + """ + return response, metadata + def pre_update_finding( self, request: securitycenter_service.UpdateFindingRequest, @@ -1954,12 +3150,35 @@ def pre_update_finding( def post_update_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for update_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_finding` interceptor runs + before the `post_update_finding_with_metadata` interceptor. """ return response + def post_update_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_finding_with_metadata` + interceptor in new development instead of the `post_update_finding` interceptor. + When both interceptors are used, this `post_update_finding_with_metadata` interceptor runs after the + `post_update_finding` interceptor. The (possibly modified) response returned by + `post_update_finding` will be passed to + `post_update_finding_with_metadata`. + """ + return response, metadata + def pre_update_mute_config( self, request: securitycenter_service.UpdateMuteConfigRequest, @@ -1980,12 +3199,35 @@ def post_update_mute_config( ) -> gcs_mute_config.MuteConfig: """Post-rpc interceptor for update_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_mute_config` interceptor runs + before the `post_update_mute_config_with_metadata` interceptor. """ return response + def post_update_mute_config_with_metadata( + self, + response: gcs_mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_mute_config_with_metadata` + interceptor in new development instead of the `post_update_mute_config` interceptor. + When both interceptors are used, this `post_update_mute_config_with_metadata` interceptor runs after the + `post_update_mute_config` interceptor. The (possibly modified) response returned by + `post_update_mute_config` will be passed to + `post_update_mute_config_with_metadata`. + """ + return response, metadata + def pre_update_notification_config( self, request: securitycenter_service.UpdateNotificationConfigRequest, @@ -2006,12 +3248,38 @@ def post_update_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for update_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_notification_config` interceptor runs + before the `post_update_notification_config_with_metadata` interceptor. """ return response + def post_update_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_notification_config_with_metadata` + interceptor in new development instead of the `post_update_notification_config` interceptor. + When both interceptors are used, this `post_update_notification_config_with_metadata` interceptor runs after the + `post_update_notification_config` interceptor. The (possibly modified) response returned by + `post_update_notification_config` will be passed to + `post_update_notification_config_with_metadata`. + """ + return response, metadata + def pre_update_organization_settings( self, request: securitycenter_service.UpdateOrganizationSettingsRequest, @@ -2032,12 +3300,38 @@ def post_update_organization_settings( ) -> gcs_organization_settings.OrganizationSettings: """Post-rpc interceptor for update_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_organization_settings` interceptor runs + before the `post_update_organization_settings_with_metadata` interceptor. """ return response + def post_update_organization_settings_with_metadata( + self, + response: gcs_organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_organization_settings_with_metadata` + interceptor in new development instead of the `post_update_organization_settings` interceptor. + When both interceptors are used, this `post_update_organization_settings_with_metadata` interceptor runs after the + `post_update_organization_settings` interceptor. The (possibly modified) response returned by + `post_update_organization_settings` will be passed to + `post_update_organization_settings_with_metadata`. + """ + return response, metadata + def pre_update_resource_value_config( self, request: securitycenter_service.UpdateResourceValueConfigRequest, @@ -2058,12 +3352,38 @@ def post_update_resource_value_config( ) -> gcs_resource_value_config.ResourceValueConfig: """Post-rpc interceptor for update_resource_value_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_resource_value_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_resource_value_config` interceptor runs + before the `post_update_resource_value_config_with_metadata` interceptor. """ return response + def post_update_resource_value_config_with_metadata( + self, + response: gcs_resource_value_config.ResourceValueConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_resource_value_config.ResourceValueConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_resource_value_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_resource_value_config_with_metadata` + interceptor in new development instead of the `post_update_resource_value_config` interceptor. + When both interceptors are used, this `post_update_resource_value_config_with_metadata` interceptor runs after the + `post_update_resource_value_config` interceptor. The (possibly modified) response returned by + `post_update_resource_value_config` will be passed to + `post_update_resource_value_config_with_metadata`. + """ + return response, metadata + def pre_update_security_health_analytics_custom_module( self, request: securitycenter_service.UpdateSecurityHealthAnalyticsCustomModuleRequest, @@ -2087,12 +3407,38 @@ def post_update_security_health_analytics_custom_module( ): """Post-rpc interceptor for update_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_security_health_analytics_custom_module` interceptor runs + before the `post_update_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_update_security_health_analytics_custom_module_with_metadata( + self, + response: gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_update_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_update_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_update_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_update_security_health_analytics_custom_module` will be passed to + `post_update_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_update_security_marks( self, request: securitycenter_service.UpdateSecurityMarksRequest, @@ -2113,12 +3459,37 @@ def post_update_security_marks( ) -> gcs_security_marks.SecurityMarks: """Post-rpc interceptor for update_security_marks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_marks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_security_marks` interceptor runs + before the `post_update_security_marks_with_metadata` interceptor. """ return response + def post_update_security_marks_with_metadata( + self, + response: gcs_security_marks.SecurityMarks, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_marks.SecurityMarks, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_security_marks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_security_marks_with_metadata` + interceptor in new development instead of the `post_update_security_marks` interceptor. + When both interceptors are used, this `post_update_security_marks_with_metadata` interceptor runs after the + `post_update_security_marks` interceptor. The (possibly modified) response returned by + `post_update_security_marks` will be passed to + `post_update_security_marks_with_metadata`. + """ + return response, metadata + def pre_update_source( self, request: securitycenter_service.UpdateSourceRequest, @@ -2137,12 +3508,35 @@ def pre_update_source( def post_update_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for update_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_source` interceptor runs + before the `post_update_source_with_metadata` interceptor. """ return response + def post_update_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_source_with_metadata` + interceptor in new development instead of the `post_update_source` interceptor. + When both interceptors are used, this `post_update_source_with_metadata` interceptor runs after the + `post_update_source` interceptor. The (possibly modified) response returned by + `post_update_source` will be passed to + `post_update_source_with_metadata`. + """ + return response, metadata + def pre_validate_event_threat_detection_custom_module( self, request: securitycenter_service.ValidateEventThreatDetectionCustomModuleRequest, @@ -2164,12 +3558,38 @@ def post_validate_event_threat_detection_custom_module( ) -> securitycenter_service.ValidateEventThreatDetectionCustomModuleResponse: """Post-rpc interceptor for validate_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_validate_event_threat_detection_custom_module` interceptor runs + before the `post_validate_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_validate_event_threat_detection_custom_module_with_metadata( + self, + response: securitycenter_service.ValidateEventThreatDetectionCustomModuleResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ValidateEventThreatDetectionCustomModuleResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for validate_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_validate_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_validate_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_validate_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_validate_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_validate_event_threat_detection_custom_module` will be passed to + `post_validate_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -2541,6 +3961,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_resource_value_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_batch_create_resource_value_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2701,6 +4128,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_mute_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_mute_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2853,6 +4284,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3024,6 +4459,13 @@ def __call__( resp = self._interceptor.post_create_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3183,6 +4625,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3335,6 +4781,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3494,6 +4944,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3672,6 +5126,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3827,6 +5288,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4649,6 +6114,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4820,6 +6289,13 @@ def __call__( resp = self._interceptor.post_get_effective_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_effective_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4995,6 +6471,13 @@ def __call__( resp = self._interceptor.post_get_effective_security_health_analytics_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_effective_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5160,6 +6643,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_event_threat_detection_custom_module(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5383,6 +6873,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 @@ -5527,6 +7021,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5677,6 +7175,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5828,6 +7330,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5980,6 +7486,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_resource_value_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_resource_value_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6150,6 +7660,13 @@ def __call__( resp = self._interceptor.post_get_security_health_analytics_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6296,6 +7813,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_simulation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_simulation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6446,6 +7967,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6591,6 +8116,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_valued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_valued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6740,6 +8269,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6891,6 +8424,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7035,6 +8572,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7184,6 +8725,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attack_paths(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attack_paths_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7333,6 +8878,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_big_query_exports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_big_query_exports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7499,6 +9048,13 @@ def __call__( resp = self._interceptor.post_list_descendant_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_descendant_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7663,6 +9219,13 @@ def __call__( resp = self._interceptor.post_list_descendant_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_descendant_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7825,6 +9388,13 @@ def __call__( resp = self._interceptor.post_list_effective_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_effective_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7989,6 +9559,13 @@ def __call__( resp = self._interceptor.post_list_effective_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_effective_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8151,6 +9728,13 @@ def __call__( resp = self._interceptor.post_list_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8295,6 +9879,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8443,6 +10031,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_mute_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_mute_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8593,6 +10185,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_notification_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_notification_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8746,6 +10342,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_resource_value_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_resource_value_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -8908,6 +10508,13 @@ def __call__( resp = self._interceptor.post_list_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9050,6 +10657,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9198,6 +10809,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_valued_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_valued_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9352,6 +10967,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_asset_discovery(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_asset_discovery_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9511,6 +11130,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_finding_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_finding_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -9732,6 +11355,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 @@ -9893,6 +11520,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_mute(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_mute_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10062,6 +11693,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_simulate_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10212,6 +11850,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 @@ -10364,6 +12006,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10535,6 +12181,13 @@ def __call__( resp = self._interceptor.post_update_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10689,6 +12342,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_external_system(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_external_system_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -10848,6 +12505,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11000,6 +12661,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11159,6 +12824,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11317,6 +12986,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11476,6 +13149,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_resource_value_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_resource_value_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11654,6 +13331,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11814,6 +13498,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_security_marks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_security_marks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -11969,6 +13657,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -12133,6 +13825,13 @@ def __call__( resp = self._interceptor.post_validate_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_validate_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py index ed461d017338..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.36.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/client.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/client.py index ed3d279ae01b..bfbe90b308ae 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/client.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/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 @@ -580,6 +582,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-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/transports/rest.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/transports/rest.py index e56acf1a5153..176d04fbdcc6 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/transports/rest.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1beta1/services/security_center/transports/rest.py @@ -250,12 +250,35 @@ def pre_create_finding( def post_create_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for create_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_finding` interceptor runs + before the `post_create_finding_with_metadata` interceptor. """ return response + def post_create_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_finding_with_metadata` + interceptor in new development instead of the `post_create_finding` interceptor. + When both interceptors are used, this `post_create_finding_with_metadata` interceptor runs after the + `post_create_finding` interceptor. The (possibly modified) response returned by + `post_create_finding` will be passed to + `post_create_finding_with_metadata`. + """ + return response, metadata + def pre_create_source( self, request: securitycenter_service.CreateSourceRequest, @@ -274,12 +297,35 @@ def pre_create_source( def post_create_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for create_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_source` interceptor runs + before the `post_create_source_with_metadata` interceptor. """ return response + def post_create_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_source_with_metadata` + interceptor in new development instead of the `post_create_source` interceptor. + When both interceptors are used, this `post_create_source_with_metadata` interceptor runs after the + `post_create_source` interceptor. The (possibly modified) response returned by + `post_create_source` will be passed to + `post_create_source_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -297,12 +343,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_organization_settings( self, request: securitycenter_service.GetOrganizationSettingsRequest, @@ -323,12 +392,38 @@ def post_get_organization_settings( ) -> organization_settings.OrganizationSettings: """Post-rpc interceptor for get_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_organization_settings` interceptor runs + before the `post_get_organization_settings_with_metadata` interceptor. """ return response + def post_get_organization_settings_with_metadata( + self, + response: organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_organization_settings_with_metadata` + interceptor in new development instead of the `post_get_organization_settings` interceptor. + When both interceptors are used, this `post_get_organization_settings_with_metadata` interceptor runs after the + `post_get_organization_settings` interceptor. The (possibly modified) response returned by + `post_get_organization_settings` will be passed to + `post_get_organization_settings_with_metadata`. + """ + return response, metadata + def pre_get_source( self, request: securitycenter_service.GetSourceRequest, @@ -346,12 +441,33 @@ def pre_get_source( def post_get_source(self, response: source.Source) -> source.Source: """Post-rpc interceptor for get_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_source` interceptor runs + before the `post_get_source_with_metadata` interceptor. """ return response + def post_get_source_with_metadata( + self, response: source.Source, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_source_with_metadata` + interceptor in new development instead of the `post_get_source` interceptor. + When both interceptors are used, this `post_get_source_with_metadata` interceptor runs after the + `post_get_source` interceptor. The (possibly modified) response returned by + `post_get_source` will be passed to + `post_get_source_with_metadata`. + """ + return response, metadata + def pre_group_assets( self, request: securitycenter_service.GroupAssetsRequest, @@ -372,12 +488,38 @@ def post_group_assets( ) -> securitycenter_service.GroupAssetsResponse: """Post-rpc interceptor for group_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_assets` interceptor runs + before the `post_group_assets_with_metadata` interceptor. """ return response + def post_group_assets_with_metadata( + self, + response: securitycenter_service.GroupAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_assets_with_metadata` + interceptor in new development instead of the `post_group_assets` interceptor. + When both interceptors are used, this `post_group_assets_with_metadata` interceptor runs after the + `post_group_assets` interceptor. The (possibly modified) response returned by + `post_group_assets` will be passed to + `post_group_assets_with_metadata`. + """ + return response, metadata + def pre_group_findings( self, request: securitycenter_service.GroupFindingsRequest, @@ -398,12 +540,38 @@ def post_group_findings( ) -> securitycenter_service.GroupFindingsResponse: """Post-rpc interceptor for group_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_findings` interceptor runs + before the `post_group_findings_with_metadata` interceptor. """ return response + def post_group_findings_with_metadata( + self, + response: securitycenter_service.GroupFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_findings_with_metadata` + interceptor in new development instead of the `post_group_findings` interceptor. + When both interceptors are used, this `post_group_findings_with_metadata` interceptor runs after the + `post_group_findings` interceptor. The (possibly modified) response returned by + `post_group_findings` will be passed to + `post_group_findings_with_metadata`. + """ + return response, metadata + def pre_list_assets( self, request: securitycenter_service.ListAssetsRequest, @@ -424,12 +592,38 @@ def post_list_assets( ) -> securitycenter_service.ListAssetsResponse: """Post-rpc interceptor for list_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_assets` interceptor runs + before the `post_list_assets_with_metadata` interceptor. """ return response + def post_list_assets_with_metadata( + self, + response: securitycenter_service.ListAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_assets_with_metadata` + interceptor in new development instead of the `post_list_assets` interceptor. + When both interceptors are used, this `post_list_assets_with_metadata` interceptor runs after the + `post_list_assets` interceptor. The (possibly modified) response returned by + `post_list_assets` will be passed to + `post_list_assets_with_metadata`. + """ + return response, metadata + def pre_list_findings( self, request: securitycenter_service.ListFindingsRequest, @@ -450,12 +644,38 @@ def post_list_findings( ) -> securitycenter_service.ListFindingsResponse: """Post-rpc interceptor for list_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_findings` interceptor runs + before the `post_list_findings_with_metadata` interceptor. """ return response + def post_list_findings_with_metadata( + self, + response: securitycenter_service.ListFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_findings_with_metadata` + interceptor in new development instead of the `post_list_findings` interceptor. + When both interceptors are used, this `post_list_findings_with_metadata` interceptor runs after the + `post_list_findings` interceptor. The (possibly modified) response returned by + `post_list_findings` will be passed to + `post_list_findings_with_metadata`. + """ + return response, metadata + def pre_list_sources( self, request: securitycenter_service.ListSourcesRequest, @@ -476,12 +696,38 @@ def post_list_sources( ) -> securitycenter_service.ListSourcesResponse: """Post-rpc interceptor for list_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_sources` interceptor runs + before the `post_list_sources_with_metadata` interceptor. """ return response + def post_list_sources_with_metadata( + self, + response: securitycenter_service.ListSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListSourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_sources_with_metadata` + interceptor in new development instead of the `post_list_sources` interceptor. + When both interceptors are used, this `post_list_sources_with_metadata` interceptor runs after the + `post_list_sources` interceptor. The (possibly modified) response returned by + `post_list_sources` will be passed to + `post_list_sources_with_metadata`. + """ + return response, metadata + def pre_run_asset_discovery( self, request: securitycenter_service.RunAssetDiscoveryRequest, @@ -502,12 +748,35 @@ def post_run_asset_discovery( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_asset_discovery - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_asset_discovery_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_run_asset_discovery` interceptor runs + before the `post_run_asset_discovery_with_metadata` interceptor. """ return response + def post_run_asset_discovery_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_asset_discovery + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_run_asset_discovery_with_metadata` + interceptor in new development instead of the `post_run_asset_discovery` interceptor. + When both interceptors are used, this `post_run_asset_discovery_with_metadata` interceptor runs after the + `post_run_asset_discovery` interceptor. The (possibly modified) response returned by + `post_run_asset_discovery` will be passed to + `post_run_asset_discovery_with_metadata`. + """ + return response, metadata + def pre_set_finding_state( self, request: securitycenter_service.SetFindingStateRequest, @@ -526,12 +795,35 @@ def pre_set_finding_state( def post_set_finding_state(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_finding_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_finding_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_finding_state` interceptor runs + before the `post_set_finding_state_with_metadata` interceptor. """ return response + def post_set_finding_state_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_finding_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_finding_state_with_metadata` + interceptor in new development instead of the `post_set_finding_state` interceptor. + When both interceptors are used, this `post_set_finding_state_with_metadata` interceptor runs after the + `post_set_finding_state` interceptor. The (possibly modified) response returned by + `post_set_finding_state` will be passed to + `post_set_finding_state_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -549,12 +841,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -575,12 +890,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_finding( self, request: securitycenter_service.UpdateFindingRequest, @@ -599,12 +940,35 @@ def pre_update_finding( def post_update_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for update_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_finding` interceptor runs + before the `post_update_finding_with_metadata` interceptor. """ return response + def post_update_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_finding_with_metadata` + interceptor in new development instead of the `post_update_finding` interceptor. + When both interceptors are used, this `post_update_finding_with_metadata` interceptor runs after the + `post_update_finding` interceptor. The (possibly modified) response returned by + `post_update_finding` will be passed to + `post_update_finding_with_metadata`. + """ + return response, metadata + def pre_update_organization_settings( self, request: securitycenter_service.UpdateOrganizationSettingsRequest, @@ -625,12 +989,38 @@ def post_update_organization_settings( ) -> gcs_organization_settings.OrganizationSettings: """Post-rpc interceptor for update_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_organization_settings` interceptor runs + before the `post_update_organization_settings_with_metadata` interceptor. """ return response + def post_update_organization_settings_with_metadata( + self, + response: gcs_organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_organization_settings_with_metadata` + interceptor in new development instead of the `post_update_organization_settings` interceptor. + When both interceptors are used, this `post_update_organization_settings_with_metadata` interceptor runs after the + `post_update_organization_settings` interceptor. The (possibly modified) response returned by + `post_update_organization_settings` will be passed to + `post_update_organization_settings_with_metadata`. + """ + return response, metadata + def pre_update_security_marks( self, request: securitycenter_service.UpdateSecurityMarksRequest, @@ -651,12 +1041,37 @@ def post_update_security_marks( ) -> gcs_security_marks.SecurityMarks: """Post-rpc interceptor for update_security_marks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_marks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_security_marks` interceptor runs + before the `post_update_security_marks_with_metadata` interceptor. """ return response + def post_update_security_marks_with_metadata( + self, + response: gcs_security_marks.SecurityMarks, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_marks.SecurityMarks, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_security_marks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_security_marks_with_metadata` + interceptor in new development instead of the `post_update_security_marks` interceptor. + When both interceptors are used, this `post_update_security_marks_with_metadata` interceptor runs after the + `post_update_security_marks` interceptor. The (possibly modified) response returned by + `post_update_security_marks` will be passed to + `post_update_security_marks_with_metadata`. + """ + return response, metadata + def pre_update_source( self, request: securitycenter_service.UpdateSourceRequest, @@ -675,12 +1090,35 @@ def pre_update_source( def post_update_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for update_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_source` interceptor runs + before the `post_update_source_with_metadata` interceptor. """ return response + def post_update_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_source_with_metadata` + interceptor in new development instead of the `post_update_source` interceptor. + When both interceptors are used, this `post_update_source_with_metadata` interceptor runs after the + `post_update_source` interceptor. The (possibly modified) response returned by + `post_update_source` will be passed to + `post_update_source_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SecurityCenterRestStub: @@ -956,6 +1394,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1109,6 +1551,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1330,6 +1776,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 @@ -1479,6 +1929,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1631,6 +2085,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1780,6 +2238,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1931,6 +2393,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2075,6 +2541,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2219,6 +2689,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2361,6 +2835,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2513,6 +2991,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_asset_discovery(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_asset_discovery_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2672,6 +3154,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_finding_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_finding_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2893,6 +3379,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 @@ -3041,6 +3531,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 @@ -3198,6 +3692,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3354,6 +3852,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3514,6 +4016,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_security_marks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_security_marks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3669,6 +4175,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py index ed461d017338..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.36.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/client.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/client.py index e9fc41549b89..e91be09835e1 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/client.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/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 @@ -623,6 +625,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-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/transports/rest.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/transports/rest.py index 94b165382eeb..378b863cfc9c 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/transports/rest.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v1p1beta1/services/security_center/transports/rest.py @@ -291,12 +291,35 @@ def pre_create_finding( def post_create_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for create_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_finding` interceptor runs + before the `post_create_finding_with_metadata` interceptor. """ return response + def post_create_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_finding_with_metadata` + interceptor in new development instead of the `post_create_finding` interceptor. + When both interceptors are used, this `post_create_finding_with_metadata` interceptor runs after the + `post_create_finding` interceptor. The (possibly modified) response returned by + `post_create_finding` will be passed to + `post_create_finding_with_metadata`. + """ + return response, metadata + def pre_create_notification_config( self, request: securitycenter_service.CreateNotificationConfigRequest, @@ -317,12 +340,38 @@ def post_create_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for create_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_notification_config` interceptor runs + before the `post_create_notification_config_with_metadata` interceptor. """ return response + def post_create_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_notification_config_with_metadata` + interceptor in new development instead of the `post_create_notification_config` interceptor. + When both interceptors are used, this `post_create_notification_config_with_metadata` interceptor runs after the + `post_create_notification_config` interceptor. The (possibly modified) response returned by + `post_create_notification_config` will be passed to + `post_create_notification_config_with_metadata`. + """ + return response, metadata + def pre_create_source( self, request: securitycenter_service.CreateSourceRequest, @@ -341,12 +390,35 @@ def pre_create_source( def post_create_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for create_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_source` interceptor runs + before the `post_create_source_with_metadata` interceptor. """ return response + def post_create_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_source_with_metadata` + interceptor in new development instead of the `post_create_source` interceptor. + When both interceptors are used, this `post_create_source_with_metadata` interceptor runs after the + `post_create_source` interceptor. The (possibly modified) response returned by + `post_create_source` will be passed to + `post_create_source_with_metadata`. + """ + return response, metadata + def pre_delete_notification_config( self, request: securitycenter_service.DeleteNotificationConfigRequest, @@ -379,12 +451,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_notification_config( self, request: securitycenter_service.GetNotificationConfigRequest, @@ -405,12 +500,37 @@ def post_get_notification_config( ) -> notification_config.NotificationConfig: """Post-rpc interceptor for get_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_notification_config` interceptor runs + before the `post_get_notification_config_with_metadata` interceptor. """ return response + def post_get_notification_config_with_metadata( + self, + response: notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + notification_config.NotificationConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_notification_config_with_metadata` + interceptor in new development instead of the `post_get_notification_config` interceptor. + When both interceptors are used, this `post_get_notification_config_with_metadata` interceptor runs after the + `post_get_notification_config` interceptor. The (possibly modified) response returned by + `post_get_notification_config` will be passed to + `post_get_notification_config_with_metadata`. + """ + return response, metadata + def pre_get_organization_settings( self, request: securitycenter_service.GetOrganizationSettingsRequest, @@ -431,12 +551,38 @@ def post_get_organization_settings( ) -> organization_settings.OrganizationSettings: """Post-rpc interceptor for get_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_organization_settings` interceptor runs + before the `post_get_organization_settings_with_metadata` interceptor. """ return response + def post_get_organization_settings_with_metadata( + self, + response: organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_organization_settings_with_metadata` + interceptor in new development instead of the `post_get_organization_settings` interceptor. + When both interceptors are used, this `post_get_organization_settings_with_metadata` interceptor runs after the + `post_get_organization_settings` interceptor. The (possibly modified) response returned by + `post_get_organization_settings` will be passed to + `post_get_organization_settings_with_metadata`. + """ + return response, metadata + def pre_get_source( self, request: securitycenter_service.GetSourceRequest, @@ -454,12 +600,33 @@ def pre_get_source( def post_get_source(self, response: source.Source) -> source.Source: """Post-rpc interceptor for get_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_source` interceptor runs + before the `post_get_source_with_metadata` interceptor. """ return response + def post_get_source_with_metadata( + self, response: source.Source, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_source_with_metadata` + interceptor in new development instead of the `post_get_source` interceptor. + When both interceptors are used, this `post_get_source_with_metadata` interceptor runs after the + `post_get_source` interceptor. The (possibly modified) response returned by + `post_get_source` will be passed to + `post_get_source_with_metadata`. + """ + return response, metadata + def pre_group_assets( self, request: securitycenter_service.GroupAssetsRequest, @@ -480,12 +647,38 @@ def post_group_assets( ) -> securitycenter_service.GroupAssetsResponse: """Post-rpc interceptor for group_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_assets` interceptor runs + before the `post_group_assets_with_metadata` interceptor. """ return response + def post_group_assets_with_metadata( + self, + response: securitycenter_service.GroupAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_assets_with_metadata` + interceptor in new development instead of the `post_group_assets` interceptor. + When both interceptors are used, this `post_group_assets_with_metadata` interceptor runs after the + `post_group_assets` interceptor. The (possibly modified) response returned by + `post_group_assets` will be passed to + `post_group_assets_with_metadata`. + """ + return response, metadata + def pre_group_findings( self, request: securitycenter_service.GroupFindingsRequest, @@ -506,12 +699,38 @@ def post_group_findings( ) -> securitycenter_service.GroupFindingsResponse: """Post-rpc interceptor for group_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_findings` interceptor runs + before the `post_group_findings_with_metadata` interceptor. """ return response + def post_group_findings_with_metadata( + self, + response: securitycenter_service.GroupFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_findings_with_metadata` + interceptor in new development instead of the `post_group_findings` interceptor. + When both interceptors are used, this `post_group_findings_with_metadata` interceptor runs after the + `post_group_findings` interceptor. The (possibly modified) response returned by + `post_group_findings` will be passed to + `post_group_findings_with_metadata`. + """ + return response, metadata + def pre_list_assets( self, request: securitycenter_service.ListAssetsRequest, @@ -532,12 +751,38 @@ def post_list_assets( ) -> securitycenter_service.ListAssetsResponse: """Post-rpc interceptor for list_assets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_assets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_assets` interceptor runs + before the `post_list_assets_with_metadata` interceptor. """ return response + def post_list_assets_with_metadata( + self, + response: securitycenter_service.ListAssetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListAssetsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_assets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_assets_with_metadata` + interceptor in new development instead of the `post_list_assets` interceptor. + When both interceptors are used, this `post_list_assets_with_metadata` interceptor runs after the + `post_list_assets` interceptor. The (possibly modified) response returned by + `post_list_assets` will be passed to + `post_list_assets_with_metadata`. + """ + return response, metadata + def pre_list_findings( self, request: securitycenter_service.ListFindingsRequest, @@ -558,12 +803,38 @@ def post_list_findings( ) -> securitycenter_service.ListFindingsResponse: """Post-rpc interceptor for list_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_findings` interceptor runs + before the `post_list_findings_with_metadata` interceptor. """ return response + def post_list_findings_with_metadata( + self, + response: securitycenter_service.ListFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_findings_with_metadata` + interceptor in new development instead of the `post_list_findings` interceptor. + When both interceptors are used, this `post_list_findings_with_metadata` interceptor runs after the + `post_list_findings` interceptor. The (possibly modified) response returned by + `post_list_findings` will be passed to + `post_list_findings_with_metadata`. + """ + return response, metadata + def pre_list_notification_configs( self, request: securitycenter_service.ListNotificationConfigsRequest, @@ -584,12 +855,38 @@ def post_list_notification_configs( ) -> securitycenter_service.ListNotificationConfigsResponse: """Post-rpc interceptor for list_notification_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_notification_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_notification_configs` interceptor runs + before the `post_list_notification_configs_with_metadata` interceptor. """ return response + def post_list_notification_configs_with_metadata( + self, + response: securitycenter_service.ListNotificationConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListNotificationConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_notification_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_notification_configs_with_metadata` + interceptor in new development instead of the `post_list_notification_configs` interceptor. + When both interceptors are used, this `post_list_notification_configs_with_metadata` interceptor runs after the + `post_list_notification_configs` interceptor. The (possibly modified) response returned by + `post_list_notification_configs` will be passed to + `post_list_notification_configs_with_metadata`. + """ + return response, metadata + def pre_list_sources( self, request: securitycenter_service.ListSourcesRequest, @@ -610,12 +907,38 @@ def post_list_sources( ) -> securitycenter_service.ListSourcesResponse: """Post-rpc interceptor for list_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_sources` interceptor runs + before the `post_list_sources_with_metadata` interceptor. """ return response + def post_list_sources_with_metadata( + self, + response: securitycenter_service.ListSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListSourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_sources_with_metadata` + interceptor in new development instead of the `post_list_sources` interceptor. + When both interceptors are used, this `post_list_sources_with_metadata` interceptor runs after the + `post_list_sources` interceptor. The (possibly modified) response returned by + `post_list_sources` will be passed to + `post_list_sources_with_metadata`. + """ + return response, metadata + def pre_run_asset_discovery( self, request: securitycenter_service.RunAssetDiscoveryRequest, @@ -636,12 +959,35 @@ def post_run_asset_discovery( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_asset_discovery - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_asset_discovery_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_run_asset_discovery` interceptor runs + before the `post_run_asset_discovery_with_metadata` interceptor. """ return response + def post_run_asset_discovery_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_asset_discovery + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_run_asset_discovery_with_metadata` + interceptor in new development instead of the `post_run_asset_discovery` interceptor. + When both interceptors are used, this `post_run_asset_discovery_with_metadata` interceptor runs after the + `post_run_asset_discovery` interceptor. The (possibly modified) response returned by + `post_run_asset_discovery` will be passed to + `post_run_asset_discovery_with_metadata`. + """ + return response, metadata + def pre_set_finding_state( self, request: securitycenter_service.SetFindingStateRequest, @@ -660,12 +1006,35 @@ def pre_set_finding_state( def post_set_finding_state(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_finding_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_finding_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_finding_state` interceptor runs + before the `post_set_finding_state_with_metadata` interceptor. """ return response + def post_set_finding_state_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_finding_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_finding_state_with_metadata` + interceptor in new development instead of the `post_set_finding_state` interceptor. + When both interceptors are used, this `post_set_finding_state_with_metadata` interceptor runs after the + `post_set_finding_state` interceptor. The (possibly modified) response returned by + `post_set_finding_state` will be passed to + `post_set_finding_state_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -683,12 +1052,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -709,12 +1101,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_finding( self, request: securitycenter_service.UpdateFindingRequest, @@ -733,12 +1151,35 @@ def pre_update_finding( def post_update_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for update_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_finding` interceptor runs + before the `post_update_finding_with_metadata` interceptor. """ return response + def post_update_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_finding_with_metadata` + interceptor in new development instead of the `post_update_finding` interceptor. + When both interceptors are used, this `post_update_finding_with_metadata` interceptor runs after the + `post_update_finding` interceptor. The (possibly modified) response returned by + `post_update_finding` will be passed to + `post_update_finding_with_metadata`. + """ + return response, metadata + def pre_update_notification_config( self, request: securitycenter_service.UpdateNotificationConfigRequest, @@ -759,12 +1200,38 @@ def post_update_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for update_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_notification_config` interceptor runs + before the `post_update_notification_config_with_metadata` interceptor. """ return response + def post_update_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_notification_config_with_metadata` + interceptor in new development instead of the `post_update_notification_config` interceptor. + When both interceptors are used, this `post_update_notification_config_with_metadata` interceptor runs after the + `post_update_notification_config` interceptor. The (possibly modified) response returned by + `post_update_notification_config` will be passed to + `post_update_notification_config_with_metadata`. + """ + return response, metadata + def pre_update_organization_settings( self, request: securitycenter_service.UpdateOrganizationSettingsRequest, @@ -785,12 +1252,38 @@ def post_update_organization_settings( ) -> gcs_organization_settings.OrganizationSettings: """Post-rpc interceptor for update_organization_settings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_organization_settings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_organization_settings` interceptor runs + before the `post_update_organization_settings_with_metadata` interceptor. """ return response + def post_update_organization_settings_with_metadata( + self, + response: gcs_organization_settings.OrganizationSettings, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_organization_settings.OrganizationSettings, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_organization_settings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_organization_settings_with_metadata` + interceptor in new development instead of the `post_update_organization_settings` interceptor. + When both interceptors are used, this `post_update_organization_settings_with_metadata` interceptor runs after the + `post_update_organization_settings` interceptor. The (possibly modified) response returned by + `post_update_organization_settings` will be passed to + `post_update_organization_settings_with_metadata`. + """ + return response, metadata + def pre_update_security_marks( self, request: securitycenter_service.UpdateSecurityMarksRequest, @@ -811,12 +1304,37 @@ def post_update_security_marks( ) -> gcs_security_marks.SecurityMarks: """Post-rpc interceptor for update_security_marks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_marks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_security_marks` interceptor runs + before the `post_update_security_marks_with_metadata` interceptor. """ return response + def post_update_security_marks_with_metadata( + self, + response: gcs_security_marks.SecurityMarks, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_marks.SecurityMarks, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_security_marks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_security_marks_with_metadata` + interceptor in new development instead of the `post_update_security_marks` interceptor. + When both interceptors are used, this `post_update_security_marks_with_metadata` interceptor runs after the + `post_update_security_marks` interceptor. The (possibly modified) response returned by + `post_update_security_marks` will be passed to + `post_update_security_marks_with_metadata`. + """ + return response, metadata + def pre_update_source( self, request: securitycenter_service.UpdateSourceRequest, @@ -835,12 +1353,35 @@ def pre_update_source( def post_update_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for update_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_source` interceptor runs + before the `post_update_source_with_metadata` interceptor. """ return response + def post_update_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_source_with_metadata` + interceptor in new development instead of the `post_update_source` interceptor. + When both interceptors are used, this `post_update_source_with_metadata` interceptor runs after the + `post_update_source` interceptor. The (possibly modified) response returned by + `post_update_source` will be passed to + `post_update_source_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class SecurityCenterRestStub: @@ -1116,6 +1657,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1276,6 +1821,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1431,6 +1980,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1765,6 +2318,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 @@ -1916,6 +2473,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2067,6 +2628,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2219,6 +2784,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2368,6 +2937,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2519,6 +3092,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2663,6 +3240,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_assets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_assets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2807,6 +3388,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2957,6 +3542,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_notification_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_notification_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3101,6 +3690,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3253,6 +3846,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_asset_discovery(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_asset_discovery_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3412,6 +4009,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_finding_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_finding_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3633,6 +4234,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 @@ -3781,6 +4386,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 @@ -3938,6 +4547,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4098,6 +4711,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4256,6 +4873,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_organization_settings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_organization_settings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4416,6 +5037,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_security_marks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_security_marks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4571,6 +5196,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py index ed461d017338..558c8aab67c5 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.36.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/client.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/client.py index dbb08c720ab5..8e4cb83bd6ec 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/client.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/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 @@ -836,6 +838,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. @@ -6310,16 +6339,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -6365,16 +6398,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, diff --git a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/transports/rest.py b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/transports/rest.py index 6b6f0b18a414..be8258b7ebde 100644 --- a/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/transports/rest.py +++ b/packages/google-cloud-securitycenter/google/cloud/securitycenter_v2/services/security_center/transports/rest.py @@ -420,12 +420,38 @@ def post_batch_create_resource_value_configs( ) -> securitycenter_service.BatchCreateResourceValueConfigsResponse: """Post-rpc interceptor for batch_create_resource_value_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_resource_value_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_resource_value_configs` interceptor runs + before the `post_batch_create_resource_value_configs_with_metadata` interceptor. """ return response + def post_batch_create_resource_value_configs_with_metadata( + self, + response: securitycenter_service.BatchCreateResourceValueConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.BatchCreateResourceValueConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for batch_create_resource_value_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_batch_create_resource_value_configs_with_metadata` + interceptor in new development instead of the `post_batch_create_resource_value_configs` interceptor. + When both interceptors are used, this `post_batch_create_resource_value_configs_with_metadata` interceptor runs after the + `post_batch_create_resource_value_configs` interceptor. The (possibly modified) response returned by + `post_batch_create_resource_value_configs` will be passed to + `post_batch_create_resource_value_configs_with_metadata`. + """ + return response, metadata + def pre_bulk_mute_findings( self, request: securitycenter_service.BulkMuteFindingsRequest, @@ -446,12 +472,35 @@ def post_bulk_mute_findings( ) -> operations_pb2.Operation: """Post-rpc interceptor for bulk_mute_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_bulk_mute_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_bulk_mute_findings` interceptor runs + before the `post_bulk_mute_findings_with_metadata` interceptor. """ return response + def post_bulk_mute_findings_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for bulk_mute_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_bulk_mute_findings_with_metadata` + interceptor in new development instead of the `post_bulk_mute_findings` interceptor. + When both interceptors are used, this `post_bulk_mute_findings_with_metadata` interceptor runs after the + `post_bulk_mute_findings` interceptor. The (possibly modified) response returned by + `post_bulk_mute_findings` will be passed to + `post_bulk_mute_findings_with_metadata`. + """ + return response, metadata + def pre_create_big_query_export( self, request: securitycenter_service.CreateBigQueryExportRequest, @@ -472,12 +521,35 @@ def post_create_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for create_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_big_query_export` interceptor runs + before the `post_create_big_query_export_with_metadata` interceptor. """ return response + def post_create_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_big_query_export_with_metadata` + interceptor in new development instead of the `post_create_big_query_export` interceptor. + When both interceptors are used, this `post_create_big_query_export_with_metadata` interceptor runs after the + `post_create_big_query_export` interceptor. The (possibly modified) response returned by + `post_create_big_query_export` will be passed to + `post_create_big_query_export_with_metadata`. + """ + return response, metadata + def pre_create_finding( self, request: securitycenter_service.CreateFindingRequest, @@ -496,12 +568,35 @@ def pre_create_finding( def post_create_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for create_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_finding` interceptor runs + before the `post_create_finding_with_metadata` interceptor. """ return response + def post_create_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_finding_with_metadata` + interceptor in new development instead of the `post_create_finding` interceptor. + When both interceptors are used, this `post_create_finding_with_metadata` interceptor runs after the + `post_create_finding` interceptor. The (possibly modified) response returned by + `post_create_finding` will be passed to + `post_create_finding_with_metadata`. + """ + return response, metadata + def pre_create_mute_config( self, request: securitycenter_service.CreateMuteConfigRequest, @@ -522,12 +617,35 @@ def post_create_mute_config( ) -> gcs_mute_config.MuteConfig: """Post-rpc interceptor for create_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_mute_config` interceptor runs + before the `post_create_mute_config_with_metadata` interceptor. """ return response + def post_create_mute_config_with_metadata( + self, + response: gcs_mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_mute_config_with_metadata` + interceptor in new development instead of the `post_create_mute_config` interceptor. + When both interceptors are used, this `post_create_mute_config_with_metadata` interceptor runs after the + `post_create_mute_config` interceptor. The (possibly modified) response returned by + `post_create_mute_config` will be passed to + `post_create_mute_config_with_metadata`. + """ + return response, metadata + def pre_create_notification_config( self, request: securitycenter_service.CreateNotificationConfigRequest, @@ -548,12 +666,38 @@ def post_create_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for create_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_notification_config` interceptor runs + before the `post_create_notification_config_with_metadata` interceptor. """ return response + def post_create_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_notification_config_with_metadata` + interceptor in new development instead of the `post_create_notification_config` interceptor. + When both interceptors are used, this `post_create_notification_config_with_metadata` interceptor runs after the + `post_create_notification_config` interceptor. The (possibly modified) response returned by + `post_create_notification_config` will be passed to + `post_create_notification_config_with_metadata`. + """ + return response, metadata + def pre_create_source( self, request: securitycenter_service.CreateSourceRequest, @@ -572,12 +716,35 @@ def pre_create_source( def post_create_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for create_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_create_source` interceptor runs + before the `post_create_source_with_metadata` interceptor. """ return response + def post_create_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_create_source_with_metadata` + interceptor in new development instead of the `post_create_source` interceptor. + When both interceptors are used, this `post_create_source_with_metadata` interceptor runs after the + `post_create_source` interceptor. The (possibly modified) response returned by + `post_create_source` will be passed to + `post_create_source_with_metadata`. + """ + return response, metadata + def pre_delete_big_query_export( self, request: securitycenter_service.DeleteBigQueryExportRequest, @@ -658,12 +825,35 @@ def post_get_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for get_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_big_query_export` interceptor runs + before the `post_get_big_query_export_with_metadata` interceptor. """ return response + def post_get_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_big_query_export_with_metadata` + interceptor in new development instead of the `post_get_big_query_export` interceptor. + When both interceptors are used, this `post_get_big_query_export_with_metadata` interceptor runs after the + `post_get_big_query_export` interceptor. The (possibly modified) response returned by + `post_get_big_query_export` will be passed to + `post_get_big_query_export_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -681,12 +871,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_mute_config( self, request: securitycenter_service.GetMuteConfigRequest, @@ -707,12 +920,35 @@ def post_get_mute_config( ) -> mute_config.MuteConfig: """Post-rpc interceptor for get_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_mute_config` interceptor runs + before the `post_get_mute_config_with_metadata` interceptor. """ return response + def post_get_mute_config_with_metadata( + self, + response: mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_mute_config_with_metadata` + interceptor in new development instead of the `post_get_mute_config` interceptor. + When both interceptors are used, this `post_get_mute_config_with_metadata` interceptor runs after the + `post_get_mute_config` interceptor. The (possibly modified) response returned by + `post_get_mute_config` will be passed to + `post_get_mute_config_with_metadata`. + """ + return response, metadata + def pre_get_notification_config( self, request: securitycenter_service.GetNotificationConfigRequest, @@ -733,12 +969,37 @@ def post_get_notification_config( ) -> notification_config.NotificationConfig: """Post-rpc interceptor for get_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_notification_config` interceptor runs + before the `post_get_notification_config_with_metadata` interceptor. """ return response + def post_get_notification_config_with_metadata( + self, + response: notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + notification_config.NotificationConfig, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_notification_config_with_metadata` + interceptor in new development instead of the `post_get_notification_config` interceptor. + When both interceptors are used, this `post_get_notification_config_with_metadata` interceptor runs after the + `post_get_notification_config` interceptor. The (possibly modified) response returned by + `post_get_notification_config` will be passed to + `post_get_notification_config_with_metadata`. + """ + return response, metadata + def pre_get_resource_value_config( self, request: securitycenter_service.GetResourceValueConfigRequest, @@ -759,12 +1020,38 @@ def post_get_resource_value_config( ) -> resource_value_config.ResourceValueConfig: """Post-rpc interceptor for get_resource_value_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_resource_value_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_resource_value_config` interceptor runs + before the `post_get_resource_value_config_with_metadata` interceptor. """ return response + def post_get_resource_value_config_with_metadata( + self, + response: resource_value_config.ResourceValueConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + resource_value_config.ResourceValueConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_resource_value_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_resource_value_config_with_metadata` + interceptor in new development instead of the `post_get_resource_value_config` interceptor. + When both interceptors are used, this `post_get_resource_value_config_with_metadata` interceptor runs after the + `post_get_resource_value_config` interceptor. The (possibly modified) response returned by + `post_get_resource_value_config` will be passed to + `post_get_resource_value_config_with_metadata`. + """ + return response, metadata + def pre_get_simulation( self, request: securitycenter_service.GetSimulationRequest, @@ -785,12 +1072,35 @@ def post_get_simulation( ) -> simulation.Simulation: """Post-rpc interceptor for get_simulation - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_simulation_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_simulation` interceptor runs + before the `post_get_simulation_with_metadata` interceptor. """ return response + def post_get_simulation_with_metadata( + self, + response: simulation.Simulation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[simulation.Simulation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_simulation + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_simulation_with_metadata` + interceptor in new development instead of the `post_get_simulation` interceptor. + When both interceptors are used, this `post_get_simulation_with_metadata` interceptor runs after the + `post_get_simulation` interceptor. The (possibly modified) response returned by + `post_get_simulation` will be passed to + `post_get_simulation_with_metadata`. + """ + return response, metadata + def pre_get_source( self, request: securitycenter_service.GetSourceRequest, @@ -808,12 +1118,33 @@ def pre_get_source( def post_get_source(self, response: source.Source) -> source.Source: """Post-rpc interceptor for get_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_source` interceptor runs + before the `post_get_source_with_metadata` interceptor. """ return response + def post_get_source_with_metadata( + self, response: source.Source, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_source_with_metadata` + interceptor in new development instead of the `post_get_source` interceptor. + When both interceptors are used, this `post_get_source_with_metadata` interceptor runs after the + `post_get_source` interceptor. The (possibly modified) response returned by + `post_get_source` will be passed to + `post_get_source_with_metadata`. + """ + return response, metadata + def pre_get_valued_resource( self, request: securitycenter_service.GetValuedResourceRequest, @@ -834,12 +1165,35 @@ def post_get_valued_resource( ) -> valued_resource.ValuedResource: """Post-rpc interceptor for get_valued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_valued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_get_valued_resource` interceptor runs + before the `post_get_valued_resource_with_metadata` interceptor. """ return response + def post_get_valued_resource_with_metadata( + self, + response: valued_resource.ValuedResource, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[valued_resource.ValuedResource, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_valued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_get_valued_resource_with_metadata` + interceptor in new development instead of the `post_get_valued_resource` interceptor. + When both interceptors are used, this `post_get_valued_resource_with_metadata` interceptor runs after the + `post_get_valued_resource` interceptor. The (possibly modified) response returned by + `post_get_valued_resource` will be passed to + `post_get_valued_resource_with_metadata`. + """ + return response, metadata + def pre_group_findings( self, request: securitycenter_service.GroupFindingsRequest, @@ -860,12 +1214,38 @@ def post_group_findings( ) -> securitycenter_service.GroupFindingsResponse: """Post-rpc interceptor for group_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_group_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_group_findings` interceptor runs + before the `post_group_findings_with_metadata` interceptor. """ return response + def post_group_findings_with_metadata( + self, + response: securitycenter_service.GroupFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.GroupFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for group_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_group_findings_with_metadata` + interceptor in new development instead of the `post_group_findings` interceptor. + When both interceptors are used, this `post_group_findings_with_metadata` interceptor runs after the + `post_group_findings` interceptor. The (possibly modified) response returned by + `post_group_findings` will be passed to + `post_group_findings_with_metadata`. + """ + return response, metadata + def pre_list_attack_paths( self, request: securitycenter_service.ListAttackPathsRequest, @@ -886,12 +1266,38 @@ def post_list_attack_paths( ) -> securitycenter_service.ListAttackPathsResponse: """Post-rpc interceptor for list_attack_paths - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attack_paths_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_attack_paths` interceptor runs + before the `post_list_attack_paths_with_metadata` interceptor. """ return response + def post_list_attack_paths_with_metadata( + self, + response: securitycenter_service.ListAttackPathsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListAttackPathsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_attack_paths + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_attack_paths_with_metadata` + interceptor in new development instead of the `post_list_attack_paths` interceptor. + When both interceptors are used, this `post_list_attack_paths_with_metadata` interceptor runs after the + `post_list_attack_paths` interceptor. The (possibly modified) response returned by + `post_list_attack_paths` will be passed to + `post_list_attack_paths_with_metadata`. + """ + return response, metadata + def pre_list_big_query_exports( self, request: securitycenter_service.ListBigQueryExportsRequest, @@ -912,12 +1318,38 @@ def post_list_big_query_exports( ) -> securitycenter_service.ListBigQueryExportsResponse: """Post-rpc interceptor for list_big_query_exports - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_big_query_exports_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_big_query_exports` interceptor runs + before the `post_list_big_query_exports_with_metadata` interceptor. """ return response + def post_list_big_query_exports_with_metadata( + self, + response: securitycenter_service.ListBigQueryExportsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListBigQueryExportsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_big_query_exports + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_big_query_exports_with_metadata` + interceptor in new development instead of the `post_list_big_query_exports` interceptor. + When both interceptors are used, this `post_list_big_query_exports_with_metadata` interceptor runs after the + `post_list_big_query_exports` interceptor. The (possibly modified) response returned by + `post_list_big_query_exports` will be passed to + `post_list_big_query_exports_with_metadata`. + """ + return response, metadata + def pre_list_findings( self, request: securitycenter_service.ListFindingsRequest, @@ -938,12 +1370,38 @@ def post_list_findings( ) -> securitycenter_service.ListFindingsResponse: """Post-rpc interceptor for list_findings - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_findings_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_findings` interceptor runs + before the `post_list_findings_with_metadata` interceptor. """ return response + def post_list_findings_with_metadata( + self, + response: securitycenter_service.ListFindingsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListFindingsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_findings + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_findings_with_metadata` + interceptor in new development instead of the `post_list_findings` interceptor. + When both interceptors are used, this `post_list_findings_with_metadata` interceptor runs after the + `post_list_findings` interceptor. The (possibly modified) response returned by + `post_list_findings` will be passed to + `post_list_findings_with_metadata`. + """ + return response, metadata + def pre_list_mute_configs( self, request: securitycenter_service.ListMuteConfigsRequest, @@ -964,12 +1422,38 @@ def post_list_mute_configs( ) -> securitycenter_service.ListMuteConfigsResponse: """Post-rpc interceptor for list_mute_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_mute_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_mute_configs` interceptor runs + before the `post_list_mute_configs_with_metadata` interceptor. """ return response + def post_list_mute_configs_with_metadata( + self, + response: securitycenter_service.ListMuteConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListMuteConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_mute_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_mute_configs_with_metadata` + interceptor in new development instead of the `post_list_mute_configs` interceptor. + When both interceptors are used, this `post_list_mute_configs_with_metadata` interceptor runs after the + `post_list_mute_configs` interceptor. The (possibly modified) response returned by + `post_list_mute_configs` will be passed to + `post_list_mute_configs_with_metadata`. + """ + return response, metadata + def pre_list_notification_configs( self, request: securitycenter_service.ListNotificationConfigsRequest, @@ -990,12 +1474,38 @@ def post_list_notification_configs( ) -> securitycenter_service.ListNotificationConfigsResponse: """Post-rpc interceptor for list_notification_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_notification_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_notification_configs` interceptor runs + before the `post_list_notification_configs_with_metadata` interceptor. """ return response + def post_list_notification_configs_with_metadata( + self, + response: securitycenter_service.ListNotificationConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListNotificationConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_notification_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_notification_configs_with_metadata` + interceptor in new development instead of the `post_list_notification_configs` interceptor. + When both interceptors are used, this `post_list_notification_configs_with_metadata` interceptor runs after the + `post_list_notification_configs` interceptor. The (possibly modified) response returned by + `post_list_notification_configs` will be passed to + `post_list_notification_configs_with_metadata`. + """ + return response, metadata + def pre_list_resource_value_configs( self, request: securitycenter_service.ListResourceValueConfigsRequest, @@ -1016,12 +1526,38 @@ def post_list_resource_value_configs( ) -> securitycenter_service.ListResourceValueConfigsResponse: """Post-rpc interceptor for list_resource_value_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_resource_value_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_resource_value_configs` interceptor runs + before the `post_list_resource_value_configs_with_metadata` interceptor. """ return response + def post_list_resource_value_configs_with_metadata( + self, + response: securitycenter_service.ListResourceValueConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListResourceValueConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_resource_value_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_resource_value_configs_with_metadata` + interceptor in new development instead of the `post_list_resource_value_configs` interceptor. + When both interceptors are used, this `post_list_resource_value_configs_with_metadata` interceptor runs after the + `post_list_resource_value_configs` interceptor. The (possibly modified) response returned by + `post_list_resource_value_configs` will be passed to + `post_list_resource_value_configs_with_metadata`. + """ + return response, metadata + def pre_list_sources( self, request: securitycenter_service.ListSourcesRequest, @@ -1042,12 +1578,38 @@ def post_list_sources( ) -> securitycenter_service.ListSourcesResponse: """Post-rpc interceptor for list_sources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_sources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_sources` interceptor runs + before the `post_list_sources_with_metadata` interceptor. """ return response + def post_list_sources_with_metadata( + self, + response: securitycenter_service.ListSourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListSourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_sources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_sources_with_metadata` + interceptor in new development instead of the `post_list_sources` interceptor. + When both interceptors are used, this `post_list_sources_with_metadata` interceptor runs after the + `post_list_sources` interceptor. The (possibly modified) response returned by + `post_list_sources` will be passed to + `post_list_sources_with_metadata`. + """ + return response, metadata + def pre_list_valued_resources( self, request: securitycenter_service.ListValuedResourcesRequest, @@ -1068,12 +1630,38 @@ def post_list_valued_resources( ) -> securitycenter_service.ListValuedResourcesResponse: """Post-rpc interceptor for list_valued_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_valued_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_list_valued_resources` interceptor runs + before the `post_list_valued_resources_with_metadata` interceptor. """ return response + def post_list_valued_resources_with_metadata( + self, + response: securitycenter_service.ListValuedResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + securitycenter_service.ListValuedResourcesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_valued_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_list_valued_resources_with_metadata` + interceptor in new development instead of the `post_list_valued_resources` interceptor. + When both interceptors are used, this `post_list_valued_resources_with_metadata` interceptor runs after the + `post_list_valued_resources` interceptor. The (possibly modified) response returned by + `post_list_valued_resources` will be passed to + `post_list_valued_resources_with_metadata`. + """ + return response, metadata + def pre_set_finding_state( self, request: securitycenter_service.SetFindingStateRequest, @@ -1092,12 +1680,35 @@ def pre_set_finding_state( def post_set_finding_state(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_finding_state - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_finding_state_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_finding_state` interceptor runs + before the `post_set_finding_state_with_metadata` interceptor. """ return response + def post_set_finding_state_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_finding_state + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_finding_state_with_metadata` + interceptor in new development instead of the `post_set_finding_state` interceptor. + When both interceptors are used, this `post_set_finding_state_with_metadata` interceptor runs after the + `post_set_finding_state` interceptor. The (possibly modified) response returned by + `post_set_finding_state` will be passed to + `post_set_finding_state_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -1115,12 +1726,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_mute( self, request: securitycenter_service.SetMuteRequest, @@ -1138,12 +1772,35 @@ def pre_set_mute( def post_set_mute(self, response: finding.Finding) -> finding.Finding: """Post-rpc interceptor for set_mute - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_mute_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_set_mute` interceptor runs + before the `post_set_mute_with_metadata` interceptor. """ return response + def post_set_mute_with_metadata( + self, + response: finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_mute + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_set_mute_with_metadata` + interceptor in new development instead of the `post_set_mute` interceptor. + When both interceptors are used, this `post_set_mute_with_metadata` interceptor runs after the + `post_set_mute` interceptor. The (possibly modified) response returned by + `post_set_mute` will be passed to + `post_set_mute_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -1164,12 +1821,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter 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_big_query_export( self, request: securitycenter_service.UpdateBigQueryExportRequest, @@ -1190,12 +1873,35 @@ def post_update_big_query_export( ) -> bigquery_export.BigQueryExport: """Post-rpc interceptor for update_big_query_export - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_big_query_export_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_big_query_export` interceptor runs + before the `post_update_big_query_export_with_metadata` interceptor. """ return response + def post_update_big_query_export_with_metadata( + self, + response: bigquery_export.BigQueryExport, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[bigquery_export.BigQueryExport, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_big_query_export + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_big_query_export_with_metadata` + interceptor in new development instead of the `post_update_big_query_export` interceptor. + When both interceptors are used, this `post_update_big_query_export_with_metadata` interceptor runs after the + `post_update_big_query_export` interceptor. The (possibly modified) response returned by + `post_update_big_query_export` will be passed to + `post_update_big_query_export_with_metadata`. + """ + return response, metadata + def pre_update_external_system( self, request: securitycenter_service.UpdateExternalSystemRequest, @@ -1216,12 +1922,37 @@ def post_update_external_system( ) -> gcs_external_system.ExternalSystem: """Post-rpc interceptor for update_external_system - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_external_system_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_external_system` interceptor runs + before the `post_update_external_system_with_metadata` interceptor. """ return response + def post_update_external_system_with_metadata( + self, + response: gcs_external_system.ExternalSystem, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_external_system.ExternalSystem, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_external_system + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_external_system_with_metadata` + interceptor in new development instead of the `post_update_external_system` interceptor. + When both interceptors are used, this `post_update_external_system_with_metadata` interceptor runs after the + `post_update_external_system` interceptor. The (possibly modified) response returned by + `post_update_external_system` will be passed to + `post_update_external_system_with_metadata`. + """ + return response, metadata + def pre_update_finding( self, request: securitycenter_service.UpdateFindingRequest, @@ -1240,12 +1971,35 @@ def pre_update_finding( def post_update_finding(self, response: gcs_finding.Finding) -> gcs_finding.Finding: """Post-rpc interceptor for update_finding - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_finding_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_finding` interceptor runs + before the `post_update_finding_with_metadata` interceptor. """ return response + def post_update_finding_with_metadata( + self, + response: gcs_finding.Finding, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_finding.Finding, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_finding + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_finding_with_metadata` + interceptor in new development instead of the `post_update_finding` interceptor. + When both interceptors are used, this `post_update_finding_with_metadata` interceptor runs after the + `post_update_finding` interceptor. The (possibly modified) response returned by + `post_update_finding` will be passed to + `post_update_finding_with_metadata`. + """ + return response, metadata + def pre_update_mute_config( self, request: securitycenter_service.UpdateMuteConfigRequest, @@ -1266,12 +2020,35 @@ def post_update_mute_config( ) -> gcs_mute_config.MuteConfig: """Post-rpc interceptor for update_mute_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_mute_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_mute_config` interceptor runs + before the `post_update_mute_config_with_metadata` interceptor. """ return response + def post_update_mute_config_with_metadata( + self, + response: gcs_mute_config.MuteConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_mute_config.MuteConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_mute_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_mute_config_with_metadata` + interceptor in new development instead of the `post_update_mute_config` interceptor. + When both interceptors are used, this `post_update_mute_config_with_metadata` interceptor runs after the + `post_update_mute_config` interceptor. The (possibly modified) response returned by + `post_update_mute_config` will be passed to + `post_update_mute_config_with_metadata`. + """ + return response, metadata + def pre_update_notification_config( self, request: securitycenter_service.UpdateNotificationConfigRequest, @@ -1292,12 +2069,38 @@ def post_update_notification_config( ) -> gcs_notification_config.NotificationConfig: """Post-rpc interceptor for update_notification_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_notification_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_notification_config` interceptor runs + before the `post_update_notification_config_with_metadata` interceptor. """ return response + def post_update_notification_config_with_metadata( + self, + response: gcs_notification_config.NotificationConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_notification_config.NotificationConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_notification_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_notification_config_with_metadata` + interceptor in new development instead of the `post_update_notification_config` interceptor. + When both interceptors are used, this `post_update_notification_config_with_metadata` interceptor runs after the + `post_update_notification_config` interceptor. The (possibly modified) response returned by + `post_update_notification_config` will be passed to + `post_update_notification_config_with_metadata`. + """ + return response, metadata + def pre_update_resource_value_config( self, request: securitycenter_service.UpdateResourceValueConfigRequest, @@ -1318,12 +2121,38 @@ def post_update_resource_value_config( ) -> gcs_resource_value_config.ResourceValueConfig: """Post-rpc interceptor for update_resource_value_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_resource_value_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_resource_value_config` interceptor runs + before the `post_update_resource_value_config_with_metadata` interceptor. """ return response + def post_update_resource_value_config_with_metadata( + self, + response: gcs_resource_value_config.ResourceValueConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_resource_value_config.ResourceValueConfig, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_resource_value_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_resource_value_config_with_metadata` + interceptor in new development instead of the `post_update_resource_value_config` interceptor. + When both interceptors are used, this `post_update_resource_value_config_with_metadata` interceptor runs after the + `post_update_resource_value_config` interceptor. The (possibly modified) response returned by + `post_update_resource_value_config` will be passed to + `post_update_resource_value_config_with_metadata`. + """ + return response, metadata + def pre_update_security_marks( self, request: securitycenter_service.UpdateSecurityMarksRequest, @@ -1344,12 +2173,37 @@ def post_update_security_marks( ) -> gcs_security_marks.SecurityMarks: """Post-rpc interceptor for update_security_marks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_marks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_security_marks` interceptor runs + before the `post_update_security_marks_with_metadata` interceptor. """ return response + def post_update_security_marks_with_metadata( + self, + response: gcs_security_marks.SecurityMarks, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + gcs_security_marks.SecurityMarks, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_security_marks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_security_marks_with_metadata` + interceptor in new development instead of the `post_update_security_marks` interceptor. + When both interceptors are used, this `post_update_security_marks_with_metadata` interceptor runs after the + `post_update_security_marks` interceptor. The (possibly modified) response returned by + `post_update_security_marks` will be passed to + `post_update_security_marks_with_metadata`. + """ + return response, metadata + def pre_update_source( self, request: securitycenter_service.UpdateSourceRequest, @@ -1368,12 +2222,35 @@ def pre_update_source( def post_update_source(self, response: gcs_source.Source) -> gcs_source.Source: """Post-rpc interceptor for update_source - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_source_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenter server but before - it is returned to user code. + it is returned to user code. This `post_update_source` interceptor runs + before the `post_update_source_with_metadata` interceptor. """ return response + def post_update_source_with_metadata( + self, + response: gcs_source.Source, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_source.Source, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_source + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenter server but before it is returned to user code. + + We recommend only using this `post_update_source_with_metadata` + interceptor in new development instead of the `post_update_source` interceptor. + When both interceptors are used, this `post_update_source_with_metadata` interceptor runs after the + `post_update_source` interceptor. The (possibly modified) response returned by + `post_update_source` will be passed to + `post_update_source_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -1745,6 +2622,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_resource_value_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_batch_create_resource_value_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1905,6 +2789,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_bulk_mute_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_bulk_mute_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2057,6 +2945,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2214,6 +3106,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2366,6 +3262,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2525,6 +3425,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2680,6 +3584,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3271,6 +4179,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3492,6 +4404,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 @@ -3637,6 +4553,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3787,6 +4707,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3939,6 +4863,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_resource_value_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_resource_value_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4085,6 +5013,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_simulation(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_simulation_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4235,6 +5167,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4380,6 +5316,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_valued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_valued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4529,6 +5469,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_group_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_group_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4678,6 +5622,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attack_paths(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attack_paths_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4827,6 +5775,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_big_query_exports(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_big_query_exports_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4973,6 +5925,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_findings(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_findings_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5123,6 +6079,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_mute_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_mute_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5273,6 +6233,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_notification_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_notification_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5426,6 +6390,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_resource_value_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_resource_value_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5570,6 +6538,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_sources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_sources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5718,6 +6690,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_valued_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_valued_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5881,6 +6857,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_finding_state(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_finding_state_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6102,6 +7082,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 @@ -6263,6 +7247,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_set_mute(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_set_mute_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6411,6 +7399,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 @@ -6563,6 +7555,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_big_query_export(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_big_query_export_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6715,6 +7711,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_external_system(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_external_system_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6874,6 +7874,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_finding(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_finding_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7026,6 +8030,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_mute_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_mute_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7185,6 +8193,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_notification_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_notification_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7344,6 +8356,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_resource_value_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_resource_value_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7504,6 +8520,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_security_marks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_security_marks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -7659,6 +8679,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_source(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_source_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json index 718cb2597203..efb11fe5de6c 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.36.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json index d203441ebc51..dc6a6d6dd78d 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.36.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json index c8e041a76af5..7eed8e8dc8ab 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v1p1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.36.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json index adb9bf7f56c6..e176e0b8c043 100644 --- a/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json +++ b/packages/google-cloud-securitycenter/samples/generated_samples/snippet_metadata_google.cloud.securitycenter.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycenter", - "version": "1.36.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1/test_security_center.py b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1/test_security_center.py index 9c8943e4714d..0145c55f0ad5 100644 --- a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1/test_security_center.py +++ b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1/test_security_center.py @@ -159,6 +159,13 @@ from google.cloud.securitycenter_v1.types import source from google.cloud.securitycenter_v1.types import source as gcs_source +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 @@ -417,6 +424,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 = SecurityCenterClient(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 = SecurityCenterClient(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", [ @@ -44260,10 +44310,14 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecurityCenterRestInterceptor, "post_bulk_mute_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_bulk_mute_findings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_bulk_mute_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.BulkMuteFindingsRequest.pb( securitycenter_service.BulkMuteFindingsRequest() ) @@ -44287,6 +44341,7 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.bulk_mute_findings( request, @@ -44298,6 +44353,7 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_security_health_analytics_custom_module_rest_bad_request( @@ -44504,11 +44560,15 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_create_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateSecurityHealthAnalyticsCustomModuleRequest.pb( securitycenter_service.CreateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -44538,6 +44598,10 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.create_security_health_analytics_custom_module( request, @@ -44549,6 +44613,7 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_source_rest_bad_request( @@ -44712,10 +44777,13 @@ def test_create_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateSourceRequest.pb( securitycenter_service.CreateSourceRequest() ) @@ -44739,6 +44807,7 @@ def test_create_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.create_source( request, @@ -44750,6 +44819,7 @@ def test_create_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_finding_rest_bad_request( @@ -45249,10 +45319,13 @@ def test_create_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateFindingRequest.pb( securitycenter_service.CreateFindingRequest() ) @@ -45276,6 +45349,7 @@ def test_create_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.create_finding( request, @@ -45287,6 +45361,7 @@ def test_create_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_mute_config_rest_bad_request( @@ -45461,10 +45536,14 @@ def test_create_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_mute_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateMuteConfigRequest.pb( securitycenter_service.CreateMuteConfigRequest() ) @@ -45488,6 +45567,7 @@ def test_create_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_mute_config.MuteConfig() + post_with_metadata.return_value = gcs_mute_config.MuteConfig(), metadata client.create_mute_config( request, @@ -45499,6 +45579,7 @@ def test_create_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_notification_config_rest_bad_request( @@ -45665,10 +45746,14 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateNotificationConfigRequest.pb( securitycenter_service.CreateNotificationConfigRequest() ) @@ -45694,6 +45779,10 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.create_notification_config( request, @@ -45705,6 +45794,7 @@ def test_create_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_mute_config_rest_bad_request( @@ -46127,10 +46217,13 @@ def test_get_simulation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_simulation" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_simulation_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_simulation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSimulationRequest.pb( securitycenter_service.GetSimulationRequest() ) @@ -46154,6 +46247,7 @@ def test_get_simulation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = simulation.Simulation() + post_with_metadata.return_value = simulation.Simulation(), metadata client.get_simulation( request, @@ -46165,6 +46259,7 @@ def test_get_simulation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_valued_resource_rest_bad_request( @@ -46266,10 +46361,14 @@ def test_get_valued_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_valued_resource" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_valued_resource_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_valued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetValuedResourceRequest.pb( securitycenter_service.GetValuedResourceRequest() ) @@ -46295,6 +46394,7 @@ def test_get_valued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = valued_resource.ValuedResource() + post_with_metadata.return_value = valued_resource.ValuedResource(), metadata client.get_valued_resource( request, @@ -46306,6 +46406,7 @@ def test_get_valued_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_big_query_export_rest_bad_request( @@ -46400,10 +46501,14 @@ def test_get_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetBigQueryExportRequest.pb( securitycenter_service.GetBigQueryExportRequest() ) @@ -46429,6 +46534,7 @@ def test_get_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.get_big_query_export( request, @@ -46440,6 +46546,7 @@ def test_get_big_query_export_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( @@ -46523,10 +46630,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -46548,6 +46658,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -46559,6 +46670,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_mute_config_rest_bad_request( @@ -46653,10 +46765,13 @@ def test_get_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_mute_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetMuteConfigRequest.pb( securitycenter_service.GetMuteConfigRequest() ) @@ -46680,6 +46795,7 @@ def test_get_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = mute_config.MuteConfig() + post_with_metadata.return_value = mute_config.MuteConfig(), metadata client.get_mute_config( request, @@ -46691,6 +46807,7 @@ def test_get_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_notification_config_rest_bad_request( @@ -46781,10 +46898,14 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetNotificationConfigRequest.pb( securitycenter_service.GetNotificationConfigRequest() ) @@ -46810,6 +46931,10 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = notification_config.NotificationConfig() + post_with_metadata.return_value = ( + notification_config.NotificationConfig(), + metadata, + ) client.get_notification_config( request, @@ -46821,6 +46946,7 @@ def test_get_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_organization_settings_rest_bad_request( @@ -46907,10 +47033,14 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetOrganizationSettingsRequest.pb( securitycenter_service.GetOrganizationSettingsRequest() ) @@ -46936,6 +47066,10 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + organization_settings.OrganizationSettings(), + metadata, + ) client.get_organization_settings( request, @@ -46947,6 +47081,7 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_security_health_analytics_custom_module_rest_bad_request( @@ -47052,11 +47187,15 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors transports.SecurityCenterRestInterceptor, "post_get_effective_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_effective_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_effective_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest.pb( securitycenter_service.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest() ) @@ -47086,6 +47225,10 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors post.return_value = ( effective_security_health_analytics_custom_module.EffectiveSecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + effective_security_health_analytics_custom_module.EffectiveSecurityHealthAnalyticsCustomModule(), + metadata, + ) client.get_effective_security_health_analytics_custom_module( request, @@ -47097,6 +47240,7 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_security_health_analytics_custom_module_rest_bad_request( @@ -47204,11 +47348,15 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_get_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.GetSecurityHealthAnalyticsCustomModuleRequest.pb( securitycenter_service.GetSecurityHealthAnalyticsCustomModuleRequest() @@ -47238,6 +47386,10 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.get_security_health_analytics_custom_module( request, @@ -47249,6 +47401,7 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_source_rest_bad_request( @@ -47339,10 +47492,13 @@ def test_get_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSourceRequest.pb( securitycenter_service.GetSourceRequest() ) @@ -47366,6 +47522,7 @@ def test_get_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = source.Source() + post_with_metadata.return_value = source.Source(), metadata client.get_source( request, @@ -47377,6 +47534,7 @@ def test_get_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_assets_rest_bad_request( @@ -47463,10 +47621,13 @@ def test_group_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupAssetsRequest.pb( securitycenter_service.GroupAssetsRequest() ) @@ -47492,6 +47653,10 @@ def test_group_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupAssetsResponse(), + metadata, + ) client.group_assets( request, @@ -47503,6 +47668,7 @@ def test_group_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_findings_rest_bad_request( @@ -47589,10 +47755,13 @@ def test_group_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupFindingsRequest.pb( securitycenter_service.GroupFindingsRequest() ) @@ -47618,6 +47787,10 @@ def test_group_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupFindingsResponse(), + metadata, + ) client.group_findings( request, @@ -47629,6 +47802,7 @@ def test_group_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_assets_rest_bad_request( @@ -47715,10 +47889,13 @@ def test_list_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListAssetsRequest.pb( securitycenter_service.ListAssetsRequest() ) @@ -47744,6 +47921,10 @@ def test_list_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListAssetsResponse(), + metadata, + ) client.list_assets( request, @@ -47755,6 +47936,7 @@ def test_list_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_descendant_security_health_analytics_custom_modules_rest_bad_request( @@ -47850,11 +48032,15 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept transports.SecurityCenterRestInterceptor, "post_list_descendant_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_descendant_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_descendant_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesRequest.pb( securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesRequest() ) @@ -47884,6 +48070,10 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept post.return_value = ( securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListDescendantSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_descendant_security_health_analytics_custom_modules( request, @@ -47895,6 +48085,7 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_findings_rest_bad_request( @@ -47981,10 +48172,13 @@ def test_list_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListFindingsRequest.pb( securitycenter_service.ListFindingsRequest() ) @@ -48010,6 +48204,10 @@ def test_list_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListFindingsResponse(), + metadata, + ) client.list_findings( request, @@ -48021,6 +48219,7 @@ def test_list_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_mute_configs_rest_bad_request( @@ -48105,10 +48304,13 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_mute_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_mute_configs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_mute_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListMuteConfigsRequest.pb( securitycenter_service.ListMuteConfigsRequest() ) @@ -48134,6 +48336,10 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListMuteConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListMuteConfigsResponse(), + metadata, + ) client.list_mute_configs( request, @@ -48145,6 +48351,7 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_notification_configs_rest_bad_request( @@ -48231,10 +48438,14 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_notification_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_notification_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_notification_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListNotificationConfigsRequest.pb( securitycenter_service.ListNotificationConfigsRequest() ) @@ -48260,6 +48471,10 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListNotificationConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListNotificationConfigsResponse(), + metadata, + ) client.list_notification_configs( request, @@ -48271,6 +48486,7 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_effective_security_health_analytics_custom_modules_rest_bad_request( @@ -48366,11 +48582,15 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto transports.SecurityCenterRestInterceptor, "post_list_effective_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_effective_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_effective_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest.pb( securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest() ) @@ -48400,6 +48620,10 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto post.return_value = ( securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_effective_security_health_analytics_custom_modules( request, @@ -48411,6 +48635,7 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_security_health_analytics_custom_modules_rest_bad_request( @@ -48504,11 +48729,15 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_list_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.ListSecurityHealthAnalyticsCustomModulesRequest.pb( securitycenter_service.ListSecurityHealthAnalyticsCustomModulesRequest() @@ -48540,6 +48769,10 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( post.return_value = ( securitycenter_service.ListSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_security_health_analytics_custom_modules( request, @@ -48551,6 +48784,7 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_sources_rest_bad_request( @@ -48635,10 +48869,13 @@ def test_list_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_sources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_sources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListSourcesRequest.pb( securitycenter_service.ListSourcesRequest() ) @@ -48664,6 +48901,10 @@ def test_list_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListSourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListSourcesResponse(), + metadata, + ) client.list_sources( request, @@ -48675,6 +48916,7 @@ def test_list_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_asset_discovery_rest_bad_request( @@ -48755,10 +48997,14 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecurityCenterRestInterceptor, "post_run_asset_discovery" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_run_asset_discovery_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_run_asset_discovery" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.RunAssetDiscoveryRequest.pb( securitycenter_service.RunAssetDiscoveryRequest() ) @@ -48782,6 +49028,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.run_asset_discovery( request, @@ -48793,6 +49040,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_finding_state_rest_bad_request( @@ -48905,10 +49153,13 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_finding_state" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_finding_state_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_finding_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetFindingStateRequest.pb( securitycenter_service.SetFindingStateRequest() ) @@ -48932,6 +49183,7 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_finding_state( request, @@ -48943,6 +49195,7 @@ def test_set_finding_state_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_mute_rest_bad_request(request_type=securitycenter_service.SetMuteRequest): @@ -49053,10 +49306,13 @@ def test_set_mute_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_mute" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_mute_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_mute" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetMuteRequest.pb( securitycenter_service.SetMuteRequest() ) @@ -49080,6 +49336,7 @@ def test_set_mute_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_mute( request, @@ -49091,6 +49348,7 @@ def test_set_mute_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( @@ -49174,10 +49432,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -49199,6 +49460,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -49210,6 +49472,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( @@ -49291,10 +49554,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -49318,6 +49585,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -49329,6 +49600,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_simulate_security_health_analytics_custom_module_rest_bad_request( @@ -49422,11 +49694,15 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_simulate_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_simulate_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_simulate_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleRequest.pb( securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -49456,6 +49732,10 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.SimulateSecurityHealthAnalyticsCustomModuleResponse(), + metadata, + ) client.simulate_security_health_analytics_custom_module( request, @@ -49467,6 +49747,7 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_external_system_rest_bad_request( @@ -49658,10 +49939,14 @@ def test_update_external_system_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_external_system" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_external_system_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_external_system" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateExternalSystemRequest.pb( securitycenter_service.UpdateExternalSystemRequest() ) @@ -49687,6 +49972,7 @@ def test_update_external_system_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_external_system.ExternalSystem() + post_with_metadata.return_value = gcs_external_system.ExternalSystem(), metadata client.update_external_system( request, @@ -49698,6 +49984,7 @@ def test_update_external_system_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_finding_rest_bad_request( @@ -50201,10 +50488,13 @@ def test_update_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateFindingRequest.pb( securitycenter_service.UpdateFindingRequest() ) @@ -50228,6 +50518,7 @@ def test_update_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.update_finding( request, @@ -50239,6 +50530,7 @@ def test_update_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_mute_config_rest_bad_request( @@ -50417,10 +50709,14 @@ def test_update_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_mute_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateMuteConfigRequest.pb( securitycenter_service.UpdateMuteConfigRequest() ) @@ -50444,6 +50740,7 @@ def test_update_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_mute_config.MuteConfig() + post_with_metadata.return_value = gcs_mute_config.MuteConfig(), metadata client.update_mute_config( request, @@ -50455,6 +50752,7 @@ def test_update_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_notification_config_rest_bad_request( @@ -50629,10 +50927,14 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateNotificationConfigRequest.pb( securitycenter_service.UpdateNotificationConfigRequest() ) @@ -50658,6 +50960,10 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.update_notification_config( request, @@ -50669,6 +50975,7 @@ def test_update_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_organization_settings_rest_bad_request( @@ -50839,10 +51146,14 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateOrganizationSettingsRequest.pb( securitycenter_service.UpdateOrganizationSettingsRequest() ) @@ -50868,6 +51179,10 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + gcs_organization_settings.OrganizationSettings(), + metadata, + ) client.update_organization_settings( request, @@ -50879,6 +51194,7 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_health_analytics_custom_module_rest_bad_request( @@ -51093,11 +51409,15 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_update_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSecurityHealthAnalyticsCustomModuleRequest.pb( securitycenter_service.UpdateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -51127,6 +51447,10 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + gcs_security_health_analytics_custom_module.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.update_security_health_analytics_custom_module( request, @@ -51138,6 +51462,7 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_source_rest_bad_request( @@ -51301,10 +51626,13 @@ def test_update_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSourceRequest.pb( securitycenter_service.UpdateSourceRequest() ) @@ -51328,6 +51656,7 @@ def test_update_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.update_source( request, @@ -51339,6 +51668,7 @@ def test_update_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_marks_rest_bad_request( @@ -51503,10 +51833,14 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_security_marks" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_security_marks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_security_marks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSecurityMarksRequest.pb( securitycenter_service.UpdateSecurityMarksRequest() ) @@ -51532,6 +51866,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_security_marks.SecurityMarks() + post_with_metadata.return_value = gcs_security_marks.SecurityMarks(), metadata client.update_security_marks( request, @@ -51543,6 +51878,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_big_query_export_rest_bad_request( @@ -51716,10 +52052,14 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateBigQueryExportRequest.pb( securitycenter_service.CreateBigQueryExportRequest() ) @@ -51745,6 +52085,7 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.create_big_query_export( request, @@ -51756,6 +52097,7 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_big_query_export_rest_bad_request( @@ -52042,10 +52384,14 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateBigQueryExportRequest.pb( securitycenter_service.UpdateBigQueryExportRequest() ) @@ -52071,6 +52417,7 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.update_big_query_export( request, @@ -52082,6 +52429,7 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_big_query_exports_rest_bad_request( @@ -52168,10 +52516,14 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_big_query_exports" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_big_query_exports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_big_query_exports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListBigQueryExportsRequest.pb( securitycenter_service.ListBigQueryExportsRequest() ) @@ -52197,6 +52549,10 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListBigQueryExportsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListBigQueryExportsResponse(), + metadata, + ) client.list_big_query_exports( request, @@ -52208,6 +52564,7 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_event_threat_detection_custom_module_rest_bad_request( @@ -52403,11 +52760,15 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_create_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.CreateEventThreatDetectionCustomModuleRequest.pb( securitycenter_service.CreateEventThreatDetectionCustomModuleRequest() @@ -52437,6 +52798,10 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule(), + metadata, + ) client.create_event_threat_detection_custom_module( request, @@ -52448,6 +52813,7 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_event_threat_detection_custom_module_rest_bad_request( @@ -52676,11 +53042,15 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce transports.SecurityCenterRestInterceptor, "post_get_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.GetEventThreatDetectionCustomModuleRequest.pb( securitycenter_service.GetEventThreatDetectionCustomModuleRequest() @@ -52710,6 +53080,10 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce post.return_value = ( event_threat_detection_custom_module.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + event_threat_detection_custom_module.EventThreatDetectionCustomModule(), + metadata, + ) client.get_event_threat_detection_custom_module( request, @@ -52721,6 +53095,7 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_descendant_event_threat_detection_custom_modules_rest_bad_request( @@ -52814,11 +53189,15 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors transports.SecurityCenterRestInterceptor, "post_list_descendant_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_descendant_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_descendant_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListDescendantEventThreatDetectionCustomModulesRequest.pb( securitycenter_service.ListDescendantEventThreatDetectionCustomModulesRequest() ) @@ -52848,6 +53227,10 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors post.return_value = ( securitycenter_service.ListDescendantEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListDescendantEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_descendant_event_threat_detection_custom_modules( request, @@ -52859,6 +53242,7 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_event_threat_detection_custom_modules_rest_bad_request( @@ -52950,11 +53334,15 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter transports.SecurityCenterRestInterceptor, "post_list_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.ListEventThreatDetectionCustomModulesRequest.pb( securitycenter_service.ListEventThreatDetectionCustomModulesRequest() @@ -52984,6 +53372,10 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter post.return_value = ( securitycenter_service.ListEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_event_threat_detection_custom_modules( request, @@ -52995,6 +53387,7 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_event_threat_detection_custom_module_rest_bad_request( @@ -53198,11 +53591,15 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_update_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.UpdateEventThreatDetectionCustomModuleRequest.pb( securitycenter_service.UpdateEventThreatDetectionCustomModuleRequest() @@ -53232,6 +53629,10 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + gcs_event_threat_detection_custom_module.EventThreatDetectionCustomModule(), + metadata, + ) client.update_event_threat_detection_custom_module( request, @@ -53243,6 +53644,7 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_validate_event_threat_detection_custom_module_rest_bad_request( @@ -53336,11 +53738,15 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_validate_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_validate_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_validate_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( securitycenter_service.ValidateEventThreatDetectionCustomModuleRequest.pb( securitycenter_service.ValidateEventThreatDetectionCustomModuleRequest() @@ -53372,6 +53778,10 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( securitycenter_service.ValidateEventThreatDetectionCustomModuleResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ValidateEventThreatDetectionCustomModuleResponse(), + metadata, + ) client.validate_event_threat_detection_custom_module( request, @@ -53383,6 +53793,7 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_event_threat_detection_custom_module_rest_bad_request( @@ -53492,11 +53903,15 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_get_effective_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_effective_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_effective_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetEffectiveEventThreatDetectionCustomModuleRequest.pb( securitycenter_service.GetEffectiveEventThreatDetectionCustomModuleRequest() ) @@ -53526,6 +53941,10 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( effective_event_threat_detection_custom_module.EffectiveEventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + effective_event_threat_detection_custom_module.EffectiveEventThreatDetectionCustomModule(), + metadata, + ) client.get_effective_event_threat_detection_custom_module( request, @@ -53537,6 +53956,7 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_effective_event_threat_detection_custom_modules_rest_bad_request( @@ -53630,11 +54050,15 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( transports.SecurityCenterRestInterceptor, "post_list_effective_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_effective_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_effective_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesRequest.pb( securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesRequest() ) @@ -53664,6 +54088,10 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( post.return_value = ( securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.ListEffectiveEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_effective_event_threat_detection_custom_modules( request, @@ -53675,6 +54103,7 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_resource_value_configs_rest_bad_request( @@ -53763,11 +54192,15 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) transports.SecurityCenterRestInterceptor, "post_batch_create_resource_value_configs", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_batch_create_resource_value_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_batch_create_resource_value_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.BatchCreateResourceValueConfigsRequest.pb( securitycenter_service.BatchCreateResourceValueConfigsRequest() ) @@ -53797,6 +54230,10 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) post.return_value = ( securitycenter_service.BatchCreateResourceValueConfigsResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.BatchCreateResourceValueConfigsResponse(), + metadata, + ) client.batch_create_resource_value_configs( request, @@ -53808,6 +54245,7 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_resource_value_config_rest_bad_request( @@ -54013,10 +54451,14 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_resource_value_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_resource_value_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_resource_value_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetResourceValueConfigRequest.pb( securitycenter_service.GetResourceValueConfigRequest() ) @@ -54042,6 +54484,10 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource_value_config.ResourceValueConfig() + post_with_metadata.return_value = ( + resource_value_config.ResourceValueConfig(), + metadata, + ) client.get_resource_value_config( request, @@ -54053,6 +54499,7 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_resource_value_configs_rest_bad_request( @@ -54139,10 +54586,14 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_resource_value_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_resource_value_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_resource_value_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListResourceValueConfigsRequest.pb( securitycenter_service.ListResourceValueConfigsRequest() ) @@ -54168,6 +54619,10 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListResourceValueConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListResourceValueConfigsResponse(), + metadata, + ) client.list_resource_value_configs( request, @@ -54179,6 +54634,7 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_resource_value_config_rest_bad_request( @@ -54370,10 +54826,14 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_resource_value_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_resource_value_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_resource_value_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateResourceValueConfigRequest.pb( securitycenter_service.UpdateResourceValueConfigRequest() ) @@ -54399,6 +54859,10 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_resource_value_config.ResourceValueConfig() + post_with_metadata.return_value = ( + gcs_resource_value_config.ResourceValueConfig(), + metadata, + ) client.update_resource_value_config( request, @@ -54410,6 +54874,7 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_valued_resources_rest_bad_request( @@ -54498,10 +54963,14 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_valued_resources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_valued_resources_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_valued_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListValuedResourcesRequest.pb( securitycenter_service.ListValuedResourcesRequest() ) @@ -54527,6 +54996,10 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListValuedResourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListValuedResourcesResponse(), + metadata, + ) client.list_valued_resources( request, @@ -54538,6 +55011,7 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_attack_paths_rest_bad_request( @@ -54622,10 +55096,13 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_attack_paths" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_attack_paths_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_attack_paths" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListAttackPathsRequest.pb( securitycenter_service.ListAttackPathsRequest() ) @@ -54651,6 +55128,10 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListAttackPathsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListAttackPathsResponse(), + metadata, + ) client.list_attack_paths( request, @@ -54662,6 +55143,7 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_operation_rest_bad_request( diff --git a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1beta1/test_security_center.py b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1beta1/test_security_center.py index 674b5f8fc263..aabcd7cf3dd6 100644 --- a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1beta1/test_security_center.py +++ b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1beta1/test_security_center.py @@ -91,6 +91,13 @@ from google.cloud.securitycenter_v1beta1.types import source from google.cloud.securitycenter_v1beta1.types import source as gcs_source +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 @@ -349,6 +356,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 = SecurityCenterClient(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 = SecurityCenterClient(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", [ @@ -12733,10 +12783,13 @@ def test_create_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateSourceRequest.pb( securitycenter_service.CreateSourceRequest() ) @@ -12760,6 +12813,7 @@ def test_create_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.create_source( request, @@ -12771,6 +12825,7 @@ def test_create_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_finding_rest_bad_request( @@ -12944,10 +12999,13 @@ def test_create_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateFindingRequest.pb( securitycenter_service.CreateFindingRequest() ) @@ -12971,6 +13029,7 @@ def test_create_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.create_finding( request, @@ -12982,6 +13041,7 @@ def test_create_finding_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( @@ -13065,10 +13125,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -13090,6 +13153,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -13101,6 +13165,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_organization_settings_rest_bad_request( @@ -13187,10 +13252,14 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetOrganizationSettingsRequest.pb( securitycenter_service.GetOrganizationSettingsRequest() ) @@ -13216,6 +13285,10 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + organization_settings.OrganizationSettings(), + metadata, + ) client.get_organization_settings( request, @@ -13227,6 +13300,7 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_source_rest_bad_request( @@ -13315,10 +13389,13 @@ def test_get_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSourceRequest.pb( securitycenter_service.GetSourceRequest() ) @@ -13342,6 +13419,7 @@ def test_get_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = source.Source() + post_with_metadata.return_value = source.Source(), metadata client.get_source( request, @@ -13353,6 +13431,7 @@ def test_get_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_assets_rest_bad_request( @@ -13437,10 +13516,13 @@ def test_group_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupAssetsRequest.pb( securitycenter_service.GroupAssetsRequest() ) @@ -13466,6 +13548,10 @@ def test_group_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupAssetsResponse(), + metadata, + ) client.group_assets( request, @@ -13477,6 +13563,7 @@ def test_group_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_findings_rest_bad_request( @@ -13561,10 +13648,13 @@ def test_group_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupFindingsRequest.pb( securitycenter_service.GroupFindingsRequest() ) @@ -13590,6 +13680,10 @@ def test_group_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupFindingsResponse(), + metadata, + ) client.group_findings( request, @@ -13601,6 +13695,7 @@ def test_group_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_assets_rest_bad_request( @@ -13687,10 +13782,13 @@ def test_list_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListAssetsRequest.pb( securitycenter_service.ListAssetsRequest() ) @@ -13716,6 +13814,10 @@ def test_list_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListAssetsResponse(), + metadata, + ) client.list_assets( request, @@ -13727,6 +13829,7 @@ def test_list_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_findings_rest_bad_request( @@ -13813,10 +13916,13 @@ def test_list_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListFindingsRequest.pb( securitycenter_service.ListFindingsRequest() ) @@ -13842,6 +13948,10 @@ def test_list_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListFindingsResponse(), + metadata, + ) client.list_findings( request, @@ -13853,6 +13963,7 @@ def test_list_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_sources_rest_bad_request( @@ -13937,10 +14048,13 @@ def test_list_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_sources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_sources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListSourcesRequest.pb( securitycenter_service.ListSourcesRequest() ) @@ -13966,6 +14080,10 @@ def test_list_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListSourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListSourcesResponse(), + metadata, + ) client.list_sources( request, @@ -13977,6 +14095,7 @@ def test_list_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_asset_discovery_rest_bad_request( @@ -14057,10 +14176,14 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecurityCenterRestInterceptor, "post_run_asset_discovery" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_run_asset_discovery_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_run_asset_discovery" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.RunAssetDiscoveryRequest.pb( securitycenter_service.RunAssetDiscoveryRequest() ) @@ -14084,6 +14207,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.run_asset_discovery( request, @@ -14095,6 +14219,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_finding_state_rest_bad_request( @@ -14189,10 +14314,13 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_finding_state" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_finding_state_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_finding_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetFindingStateRequest.pb( securitycenter_service.SetFindingStateRequest() ) @@ -14216,6 +14344,7 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_finding_state( request, @@ -14227,6 +14356,7 @@ def test_set_finding_state_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( @@ -14310,10 +14440,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14335,6 +14468,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -14346,6 +14480,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( @@ -14427,10 +14562,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -14454,6 +14593,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -14465,6 +14608,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_finding_rest_bad_request( @@ -14642,10 +14786,13 @@ def test_update_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateFindingRequest.pb( securitycenter_service.UpdateFindingRequest() ) @@ -14669,6 +14816,7 @@ def test_update_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.update_finding( request, @@ -14680,6 +14828,7 @@ def test_update_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_organization_settings_rest_bad_request( @@ -14849,10 +14998,14 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateOrganizationSettingsRequest.pb( securitycenter_service.UpdateOrganizationSettingsRequest() ) @@ -14878,6 +15031,10 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + gcs_organization_settings.OrganizationSettings(), + metadata, + ) client.update_organization_settings( request, @@ -14889,6 +15046,7 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_source_rest_bad_request( @@ -15049,10 +15207,13 @@ def test_update_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSourceRequest.pb( securitycenter_service.UpdateSourceRequest() ) @@ -15076,6 +15237,7 @@ def test_update_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.update_source( request, @@ -15087,6 +15249,7 @@ def test_update_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_marks_rest_bad_request( @@ -15248,10 +15411,14 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_security_marks" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_security_marks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_security_marks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSecurityMarksRequest.pb( securitycenter_service.UpdateSecurityMarksRequest() ) @@ -15277,6 +15444,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_security_marks.SecurityMarks() + post_with_metadata.return_value = gcs_security_marks.SecurityMarks(), metadata client.update_security_marks( request, @@ -15288,6 +15456,7 @@ def test_update_security_marks_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-securitycenter/tests/unit/gapic/securitycenter_v1p1beta1/test_security_center.py b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1p1beta1/test_security_center.py index dc96962e6107..991f1d91db0c 100644 --- a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1p1beta1/test_security_center.py +++ b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v1p1beta1/test_security_center.py @@ -96,6 +96,13 @@ from google.cloud.securitycenter_v1p1beta1.types import source from google.cloud.securitycenter_v1p1beta1.types import source as gcs_source +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 = SecurityCenterClient(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 = SecurityCenterClient(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", [ @@ -16458,10 +16508,13 @@ def test_create_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateSourceRequest.pb( securitycenter_service.CreateSourceRequest() ) @@ -16485,6 +16538,7 @@ def test_create_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.create_source( request, @@ -16496,6 +16550,7 @@ def test_create_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_finding_rest_bad_request( @@ -16679,10 +16734,13 @@ def test_create_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateFindingRequest.pb( securitycenter_service.CreateFindingRequest() ) @@ -16706,6 +16764,7 @@ def test_create_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.create_finding( request, @@ -16717,6 +16776,7 @@ def test_create_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_notification_config_rest_bad_request( @@ -16889,10 +16949,14 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateNotificationConfigRequest.pb( securitycenter_service.CreateNotificationConfigRequest() ) @@ -16918,6 +16982,10 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.create_notification_config( request, @@ -16929,6 +16997,7 @@ def test_create_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_notification_config_rest_bad_request( @@ -17121,10 +17190,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -17146,6 +17218,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -17157,6 +17230,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_notification_config_rest_bad_request( @@ -17251,10 +17325,14 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetNotificationConfigRequest.pb( securitycenter_service.GetNotificationConfigRequest() ) @@ -17280,6 +17358,10 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = notification_config.NotificationConfig() + post_with_metadata.return_value = ( + notification_config.NotificationConfig(), + metadata, + ) client.get_notification_config( request, @@ -17291,6 +17373,7 @@ def test_get_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_organization_settings_rest_bad_request( @@ -17377,10 +17460,14 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetOrganizationSettingsRequest.pb( securitycenter_service.GetOrganizationSettingsRequest() ) @@ -17406,6 +17493,10 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + organization_settings.OrganizationSettings(), + metadata, + ) client.get_organization_settings( request, @@ -17417,6 +17508,7 @@ def test_get_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_source_rest_bad_request( @@ -17507,10 +17599,13 @@ def test_get_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSourceRequest.pb( securitycenter_service.GetSourceRequest() ) @@ -17534,6 +17629,7 @@ def test_get_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = source.Source() + post_with_metadata.return_value = source.Source(), metadata client.get_source( request, @@ -17545,6 +17641,7 @@ def test_get_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_assets_rest_bad_request( @@ -17631,10 +17728,13 @@ def test_group_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupAssetsRequest.pb( securitycenter_service.GroupAssetsRequest() ) @@ -17660,6 +17760,10 @@ def test_group_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupAssetsResponse(), + metadata, + ) client.group_assets( request, @@ -17671,6 +17775,7 @@ def test_group_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_findings_rest_bad_request( @@ -17757,10 +17862,13 @@ def test_group_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupFindingsRequest.pb( securitycenter_service.GroupFindingsRequest() ) @@ -17786,6 +17894,10 @@ def test_group_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupFindingsResponse(), + metadata, + ) client.group_findings( request, @@ -17797,6 +17909,7 @@ def test_group_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_assets_rest_bad_request( @@ -17883,10 +17996,13 @@ def test_list_assets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_assets" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_assets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_assets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListAssetsRequest.pb( securitycenter_service.ListAssetsRequest() ) @@ -17912,6 +18028,10 @@ def test_list_assets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListAssetsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListAssetsResponse(), + metadata, + ) client.list_assets( request, @@ -17923,6 +18043,7 @@ def test_list_assets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_findings_rest_bad_request( @@ -18009,10 +18130,13 @@ def test_list_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListFindingsRequest.pb( securitycenter_service.ListFindingsRequest() ) @@ -18038,6 +18162,10 @@ def test_list_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListFindingsResponse(), + metadata, + ) client.list_findings( request, @@ -18049,6 +18177,7 @@ def test_list_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_notification_configs_rest_bad_request( @@ -18135,10 +18264,14 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_notification_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_notification_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_notification_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListNotificationConfigsRequest.pb( securitycenter_service.ListNotificationConfigsRequest() ) @@ -18164,6 +18297,10 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListNotificationConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListNotificationConfigsResponse(), + metadata, + ) client.list_notification_configs( request, @@ -18175,6 +18312,7 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_sources_rest_bad_request( @@ -18259,10 +18397,13 @@ def test_list_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_sources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_sources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListSourcesRequest.pb( securitycenter_service.ListSourcesRequest() ) @@ -18288,6 +18429,10 @@ def test_list_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListSourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListSourcesResponse(), + metadata, + ) client.list_sources( request, @@ -18299,6 +18444,7 @@ def test_list_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_asset_discovery_rest_bad_request( @@ -18379,10 +18525,14 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecurityCenterRestInterceptor, "post_run_asset_discovery" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_run_asset_discovery_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_run_asset_discovery" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.RunAssetDiscoveryRequest.pb( securitycenter_service.RunAssetDiscoveryRequest() ) @@ -18406,6 +18556,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.run_asset_discovery( request, @@ -18417,6 +18568,7 @@ def test_run_asset_discovery_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_finding_state_rest_bad_request( @@ -18515,10 +18667,13 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_finding_state" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_finding_state_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_finding_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetFindingStateRequest.pb( securitycenter_service.SetFindingStateRequest() ) @@ -18542,6 +18697,7 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_finding_state( request, @@ -18553,6 +18709,7 @@ def test_set_finding_state_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( @@ -18636,10 +18793,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -18661,6 +18821,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -18672,6 +18833,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( @@ -18753,10 +18915,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -18780,6 +18946,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -18791,6 +18961,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_finding_rest_bad_request( @@ -18978,10 +19149,13 @@ def test_update_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateFindingRequest.pb( securitycenter_service.UpdateFindingRequest() ) @@ -19005,6 +19179,7 @@ def test_update_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.update_finding( request, @@ -19016,6 +19191,7 @@ def test_update_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_notification_config_rest_bad_request( @@ -19196,10 +19372,14 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateNotificationConfigRequest.pb( securitycenter_service.UpdateNotificationConfigRequest() ) @@ -19225,6 +19405,10 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.update_notification_config( request, @@ -19236,6 +19420,7 @@ def test_update_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_organization_settings_rest_bad_request( @@ -19406,10 +19591,14 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_organization_settings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_organization_settings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_organization_settings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateOrganizationSettingsRequest.pb( securitycenter_service.UpdateOrganizationSettingsRequest() ) @@ -19435,6 +19624,10 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_organization_settings.OrganizationSettings() + post_with_metadata.return_value = ( + gcs_organization_settings.OrganizationSettings(), + metadata, + ) client.update_organization_settings( request, @@ -19446,6 +19639,7 @@ def test_update_organization_settings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_source_rest_bad_request( @@ -19609,10 +19803,13 @@ def test_update_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSourceRequest.pb( securitycenter_service.UpdateSourceRequest() ) @@ -19636,6 +19833,7 @@ def test_update_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.update_source( request, @@ -19647,6 +19845,7 @@ def test_update_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_marks_rest_bad_request( @@ -19811,10 +20010,14 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_security_marks" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_security_marks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_security_marks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSecurityMarksRequest.pb( securitycenter_service.UpdateSecurityMarksRequest() ) @@ -19840,6 +20043,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_security_marks.SecurityMarks() + post_with_metadata.return_value = gcs_security_marks.SecurityMarks(), metadata client.update_security_marks( request, @@ -19851,6 +20055,7 @@ def test_update_security_marks_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-securitycenter/tests/unit/gapic/securitycenter_v2/test_security_center.py b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v2/test_security_center.py index 0eecc5c1dda3..7cb77cd029cc 100644 --- a/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v2/test_security_center.py +++ b/packages/google-cloud-securitycenter/tests/unit/gapic/securitycenter_v2/test_security_center.py @@ -137,6 +137,13 @@ from google.cloud.securitycenter_v2.types import source from google.cloud.securitycenter_v2.types import source as gcs_source +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 @@ -395,6 +402,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 = SecurityCenterClient(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 = SecurityCenterClient(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", [ @@ -28479,11 +28529,15 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) transports.SecurityCenterRestInterceptor, "post_batch_create_resource_value_configs", ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_batch_create_resource_value_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_batch_create_resource_value_configs", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.BatchCreateResourceValueConfigsRequest.pb( securitycenter_service.BatchCreateResourceValueConfigsRequest() ) @@ -28513,6 +28567,10 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) post.return_value = ( securitycenter_service.BatchCreateResourceValueConfigsResponse() ) + post_with_metadata.return_value = ( + securitycenter_service.BatchCreateResourceValueConfigsResponse(), + metadata, + ) client.batch_create_resource_value_configs( request, @@ -28524,6 +28582,7 @@ def test_batch_create_resource_value_configs_rest_interceptors(null_interceptor) pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_bulk_mute_findings_rest_bad_request( @@ -28604,10 +28663,14 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SecurityCenterRestInterceptor, "post_bulk_mute_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_bulk_mute_findings_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_bulk_mute_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.BulkMuteFindingsRequest.pb( securitycenter_service.BulkMuteFindingsRequest() ) @@ -28631,6 +28694,7 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.bulk_mute_findings( request, @@ -28642,6 +28706,7 @@ def test_bulk_mute_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_big_query_export_rest_bad_request( @@ -28815,10 +28880,14 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateBigQueryExportRequest.pb( securitycenter_service.CreateBigQueryExportRequest() ) @@ -28844,6 +28913,7 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.create_big_query_export( request, @@ -28855,6 +28925,7 @@ def test_create_big_query_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_finding_rest_bad_request( @@ -29354,10 +29425,13 @@ def test_create_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateFindingRequest.pb( securitycenter_service.CreateFindingRequest() ) @@ -29381,6 +29455,7 @@ def test_create_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.create_finding( request, @@ -29392,6 +29467,7 @@ def test_create_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_mute_config_rest_bad_request( @@ -29563,10 +29639,14 @@ def test_create_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_mute_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateMuteConfigRequest.pb( securitycenter_service.CreateMuteConfigRequest() ) @@ -29590,6 +29670,7 @@ def test_create_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_mute_config.MuteConfig() + post_with_metadata.return_value = gcs_mute_config.MuteConfig(), metadata client.create_mute_config( request, @@ -29601,6 +29682,7 @@ def test_create_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_notification_config_rest_bad_request( @@ -29767,10 +29849,14 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_create_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateNotificationConfigRequest.pb( securitycenter_service.CreateNotificationConfigRequest() ) @@ -29796,6 +29882,10 @@ def test_create_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.create_notification_config( request, @@ -29807,6 +29897,7 @@ def test_create_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_source_rest_bad_request( @@ -29970,10 +30061,13 @@ def test_create_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_create_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_create_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_create_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.CreateSourceRequest.pb( securitycenter_service.CreateSourceRequest() ) @@ -29997,6 +30091,7 @@ def test_create_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.create_source( request, @@ -30008,6 +30103,7 @@ def test_create_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_big_query_export_rest_bad_request( @@ -30550,10 +30646,14 @@ def test_get_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetBigQueryExportRequest.pb( securitycenter_service.GetBigQueryExportRequest() ) @@ -30579,6 +30679,7 @@ def test_get_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.get_big_query_export( request, @@ -30590,6 +30691,7 @@ def test_get_big_query_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_simulation_rest_bad_request( @@ -30676,10 +30778,13 @@ def test_get_simulation_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_simulation" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_simulation_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_simulation" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSimulationRequest.pb( securitycenter_service.GetSimulationRequest() ) @@ -30703,6 +30808,7 @@ def test_get_simulation_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = simulation.Simulation() + post_with_metadata.return_value = simulation.Simulation(), metadata client.get_simulation( request, @@ -30714,6 +30820,7 @@ def test_get_simulation_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_valued_resource_rest_bad_request( @@ -30815,10 +30922,14 @@ def test_get_valued_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_valued_resource" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_valued_resource_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_valued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetValuedResourceRequest.pb( securitycenter_service.GetValuedResourceRequest() ) @@ -30844,6 +30955,7 @@ def test_get_valued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = valued_resource.ValuedResource() + post_with_metadata.return_value = valued_resource.ValuedResource(), metadata client.get_valued_resource( request, @@ -30855,6 +30967,7 @@ def test_get_valued_resource_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( @@ -30938,10 +31051,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -30963,6 +31079,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -30974,6 +31091,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_mute_config_rest_bad_request( @@ -31066,10 +31184,13 @@ def test_get_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_mute_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetMuteConfigRequest.pb( securitycenter_service.GetMuteConfigRequest() ) @@ -31093,6 +31214,7 @@ def test_get_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = mute_config.MuteConfig() + post_with_metadata.return_value = mute_config.MuteConfig(), metadata client.get_mute_config( request, @@ -31104,6 +31226,7 @@ def test_get_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_notification_config_rest_bad_request( @@ -31198,10 +31321,14 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetNotificationConfigRequest.pb( securitycenter_service.GetNotificationConfigRequest() ) @@ -31227,6 +31354,10 @@ def test_get_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = notification_config.NotificationConfig() + post_with_metadata.return_value = ( + notification_config.NotificationConfig(), + metadata, + ) client.get_notification_config( request, @@ -31238,6 +31369,7 @@ def test_get_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_resource_value_config_rest_bad_request( @@ -31334,10 +31466,14 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_resource_value_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_get_resource_value_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_resource_value_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetResourceValueConfigRequest.pb( securitycenter_service.GetResourceValueConfigRequest() ) @@ -31363,6 +31499,10 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource_value_config.ResourceValueConfig() + post_with_metadata.return_value = ( + resource_value_config.ResourceValueConfig(), + metadata, + ) client.get_resource_value_config( request, @@ -31374,6 +31514,7 @@ def test_get_resource_value_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_source_rest_bad_request( @@ -31464,10 +31605,13 @@ def test_get_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_get_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_get_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_get_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GetSourceRequest.pb( securitycenter_service.GetSourceRequest() ) @@ -31491,6 +31635,7 @@ def test_get_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = source.Source() + post_with_metadata.return_value = source.Source(), metadata client.get_source( request, @@ -31502,6 +31647,7 @@ def test_get_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_group_findings_rest_bad_request( @@ -31588,10 +31734,13 @@ def test_group_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_group_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_group_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_group_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.GroupFindingsRequest.pb( securitycenter_service.GroupFindingsRequest() ) @@ -31617,6 +31766,10 @@ def test_group_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.GroupFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.GroupFindingsResponse(), + metadata, + ) client.group_findings( request, @@ -31628,6 +31781,7 @@ def test_group_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_attack_paths_rest_bad_request( @@ -31712,10 +31866,13 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_attack_paths" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_attack_paths_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_attack_paths" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListAttackPathsRequest.pb( securitycenter_service.ListAttackPathsRequest() ) @@ -31741,6 +31898,10 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListAttackPathsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListAttackPathsResponse(), + metadata, + ) client.list_attack_paths( request, @@ -31752,6 +31913,7 @@ def test_list_attack_paths_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_big_query_exports_rest_bad_request( @@ -31838,10 +32000,14 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_big_query_exports" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_big_query_exports_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_big_query_exports" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListBigQueryExportsRequest.pb( securitycenter_service.ListBigQueryExportsRequest() ) @@ -31867,6 +32033,10 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListBigQueryExportsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListBigQueryExportsResponse(), + metadata, + ) client.list_big_query_exports( request, @@ -31878,6 +32048,7 @@ def test_list_big_query_exports_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_findings_rest_bad_request( @@ -31964,10 +32135,13 @@ def test_list_findings_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_findings" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_findings_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_findings" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListFindingsRequest.pb( securitycenter_service.ListFindingsRequest() ) @@ -31993,6 +32167,10 @@ def test_list_findings_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListFindingsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListFindingsResponse(), + metadata, + ) client.list_findings( request, @@ -32004,6 +32182,7 @@ def test_list_findings_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_mute_configs_rest_bad_request( @@ -32088,10 +32267,13 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_mute_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_mute_configs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_mute_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListMuteConfigsRequest.pb( securitycenter_service.ListMuteConfigsRequest() ) @@ -32117,6 +32299,10 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListMuteConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListMuteConfigsResponse(), + metadata, + ) client.list_mute_configs( request, @@ -32128,6 +32314,7 @@ def test_list_mute_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_notification_configs_rest_bad_request( @@ -32214,10 +32401,14 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_notification_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_notification_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_notification_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListNotificationConfigsRequest.pb( securitycenter_service.ListNotificationConfigsRequest() ) @@ -32243,6 +32434,10 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListNotificationConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListNotificationConfigsResponse(), + metadata, + ) client.list_notification_configs( request, @@ -32254,6 +32449,7 @@ def test_list_notification_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_resource_value_configs_rest_bad_request( @@ -32340,10 +32536,14 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_resource_value_configs" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_resource_value_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_resource_value_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListResourceValueConfigsRequest.pb( securitycenter_service.ListResourceValueConfigsRequest() ) @@ -32369,6 +32569,10 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListResourceValueConfigsResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListResourceValueConfigsResponse(), + metadata, + ) client.list_resource_value_configs( request, @@ -32380,6 +32584,7 @@ def test_list_resource_value_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_sources_rest_bad_request( @@ -32464,10 +32669,13 @@ def test_list_sources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_sources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_list_sources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_sources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListSourcesRequest.pb( securitycenter_service.ListSourcesRequest() ) @@ -32493,6 +32701,10 @@ def test_list_sources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListSourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListSourcesResponse(), + metadata, + ) client.list_sources( request, @@ -32504,6 +32716,7 @@ def test_list_sources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_valued_resources_rest_bad_request( @@ -32592,10 +32805,14 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_list_valued_resources" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_list_valued_resources_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_list_valued_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.ListValuedResourcesRequest.pb( securitycenter_service.ListValuedResourcesRequest() ) @@ -32621,6 +32838,10 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = securitycenter_service.ListValuedResourcesResponse() + post_with_metadata.return_value = ( + securitycenter_service.ListValuedResourcesResponse(), + metadata, + ) client.list_valued_resources( request, @@ -32632,6 +32853,7 @@ def test_list_valued_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_finding_state_rest_bad_request( @@ -32744,10 +32966,13 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_finding_state" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_finding_state_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_finding_state" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetFindingStateRequest.pb( securitycenter_service.SetFindingStateRequest() ) @@ -32771,6 +32996,7 @@ def test_set_finding_state_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_finding_state( request, @@ -32782,6 +33008,7 @@ def test_set_finding_state_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( @@ -32865,10 +33092,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -32890,6 +33120,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -32901,6 +33132,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_mute_rest_bad_request(request_type=securitycenter_service.SetMuteRequest): @@ -33011,10 +33243,13 @@ def test_set_mute_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_set_mute" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_set_mute_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_set_mute" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.SetMuteRequest.pb( securitycenter_service.SetMuteRequest() ) @@ -33038,6 +33273,7 @@ def test_set_mute_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = finding.Finding() + post_with_metadata.return_value = finding.Finding(), metadata client.set_mute( request, @@ -33049,6 +33285,7 @@ def test_set_mute_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( @@ -33130,10 +33367,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -33157,6 +33398,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -33168,6 +33413,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_big_query_export_rest_bad_request( @@ -33349,10 +33595,14 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_big_query_export" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_big_query_export_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_big_query_export" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateBigQueryExportRequest.pb( securitycenter_service.UpdateBigQueryExportRequest() ) @@ -33378,6 +33628,7 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = bigquery_export.BigQueryExport() + post_with_metadata.return_value = bigquery_export.BigQueryExport(), metadata client.update_big_query_export( request, @@ -33389,6 +33640,7 @@ def test_update_big_query_export_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_external_system_rest_bad_request( @@ -33580,10 +33832,14 @@ def test_update_external_system_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_external_system" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_external_system_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_external_system" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateExternalSystemRequest.pb( securitycenter_service.UpdateExternalSystemRequest() ) @@ -33609,6 +33865,7 @@ def test_update_external_system_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_external_system.ExternalSystem() + post_with_metadata.return_value = gcs_external_system.ExternalSystem(), metadata client.update_external_system( request, @@ -33620,6 +33877,7 @@ def test_update_external_system_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_finding_rest_bad_request( @@ -34123,10 +34381,13 @@ def test_update_finding_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_finding" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_finding_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_finding" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateFindingRequest.pb( securitycenter_service.UpdateFindingRequest() ) @@ -34150,6 +34411,7 @@ def test_update_finding_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_finding.Finding() + post_with_metadata.return_value = gcs_finding.Finding(), metadata client.update_finding( request, @@ -34161,6 +34423,7 @@ def test_update_finding_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_mute_config_rest_bad_request( @@ -34336,10 +34599,14 @@ def test_update_mute_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_mute_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_mute_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_mute_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateMuteConfigRequest.pb( securitycenter_service.UpdateMuteConfigRequest() ) @@ -34363,6 +34630,7 @@ def test_update_mute_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_mute_config.MuteConfig() + post_with_metadata.return_value = gcs_mute_config.MuteConfig(), metadata client.update_mute_config( request, @@ -34374,6 +34642,7 @@ def test_update_mute_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_notification_config_rest_bad_request( @@ -34548,10 +34817,14 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_notification_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_notification_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_notification_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateNotificationConfigRequest.pb( securitycenter_service.UpdateNotificationConfigRequest() ) @@ -34577,6 +34850,10 @@ def test_update_notification_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_notification_config.NotificationConfig() + post_with_metadata.return_value = ( + gcs_notification_config.NotificationConfig(), + metadata, + ) client.update_notification_config( request, @@ -34588,6 +34865,7 @@ def test_update_notification_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_resource_value_config_rest_bad_request( @@ -34779,10 +35057,14 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_resource_value_config" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_resource_value_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_resource_value_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateResourceValueConfigRequest.pb( securitycenter_service.UpdateResourceValueConfigRequest() ) @@ -34808,6 +35090,10 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_resource_value_config.ResourceValueConfig() + post_with_metadata.return_value = ( + gcs_resource_value_config.ResourceValueConfig(), + metadata, + ) client.update_resource_value_config( request, @@ -34819,6 +35105,7 @@ def test_update_resource_value_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_marks_rest_bad_request( @@ -34987,10 +35274,14 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_security_marks" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, + "post_update_security_marks_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_security_marks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSecurityMarksRequest.pb( securitycenter_service.UpdateSecurityMarksRequest() ) @@ -35016,6 +35307,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_security_marks.SecurityMarks() + post_with_metadata.return_value = gcs_security_marks.SecurityMarks(), metadata client.update_security_marks( request, @@ -35027,6 +35319,7 @@ def test_update_security_marks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_source_rest_bad_request( @@ -35190,10 +35483,13 @@ def test_update_source_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SecurityCenterRestInterceptor, "post_update_source" ) as post, mock.patch.object( + transports.SecurityCenterRestInterceptor, "post_update_source_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterRestInterceptor, "pre_update_source" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = securitycenter_service.UpdateSourceRequest.pb( securitycenter_service.UpdateSourceRequest() ) @@ -35217,6 +35513,7 @@ def test_update_source_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_source.Source() + post_with_metadata.return_value = gcs_source.Source(), metadata client.update_source( request, @@ -35228,6 +35525,7 @@ def test_update_source_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_operation_rest_bad_request( diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py index 3c51a1157647..558c8aab67c5 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py index 3c51a1157647..558c8aab67c5 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.18" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/client.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/client.py index 51252e3057e5..49d2130c81f6 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/client.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -609,6 +611,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. @@ -3715,16 +3744,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3770,16 +3803,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/transports/rest.py b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/transports/rest.py index 46c9a45b4e5c..5c26dbdc1575 100644 --- a/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/transports/rest.py +++ b/packages/google-cloud-securitycentermanagement/google/cloud/securitycentermanagement_v1/services/security_center_management/transports/rest.py @@ -256,12 +256,38 @@ def post_create_event_threat_detection_custom_module( ) -> security_center_management.EventThreatDetectionCustomModule: """Post-rpc interceptor for create_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_event_threat_detection_custom_module` interceptor runs + before the `post_create_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_create_event_threat_detection_custom_module_with_metadata( + self, + response: security_center_management.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_create_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_create_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_create_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_create_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_create_event_threat_detection_custom_module` will be passed to + `post_create_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_create_security_health_analytics_custom_module( self, request: security_center_management.CreateSecurityHealthAnalyticsCustomModuleRequest, @@ -282,12 +308,38 @@ def post_create_security_health_analytics_custom_module( ) -> security_center_management.SecurityHealthAnalyticsCustomModule: """Post-rpc interceptor for create_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_create_security_health_analytics_custom_module` interceptor runs + before the `post_create_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_create_security_health_analytics_custom_module_with_metadata( + self, + response: security_center_management.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for create_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_create_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_create_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_create_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_create_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_create_security_health_analytics_custom_module` will be passed to + `post_create_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_delete_event_threat_detection_custom_module( self, request: security_center_management.DeleteEventThreatDetectionCustomModuleRequest, @@ -339,12 +391,38 @@ def post_get_effective_event_threat_detection_custom_module( ) -> security_center_management.EffectiveEventThreatDetectionCustomModule: """Post-rpc interceptor for get_effective_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_event_threat_detection_custom_module` interceptor runs + before the `post_get_effective_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_get_effective_event_threat_detection_custom_module_with_metadata( + self, + response: security_center_management.EffectiveEventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.EffectiveEventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_get_effective_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_get_effective_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_get_effective_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_get_effective_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_get_effective_event_threat_detection_custom_module` will be passed to + `post_get_effective_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_effective_security_health_analytics_custom_module( self, request: security_center_management.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest, @@ -366,12 +444,38 @@ def post_get_effective_security_health_analytics_custom_module( ) -> security_center_management.EffectiveSecurityHealthAnalyticsCustomModule: """Post-rpc interceptor for get_effective_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_effective_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_effective_security_health_analytics_custom_module` interceptor runs + before the `post_get_effective_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_get_effective_security_health_analytics_custom_module_with_metadata( + self, + response: security_center_management.EffectiveSecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.EffectiveSecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_effective_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_get_effective_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_get_effective_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_get_effective_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_get_effective_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_get_effective_security_health_analytics_custom_module` will be passed to + `post_get_effective_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_event_threat_detection_custom_module( self, request: security_center_management.GetEventThreatDetectionCustomModuleRequest, @@ -392,12 +496,38 @@ def post_get_event_threat_detection_custom_module( ) -> security_center_management.EventThreatDetectionCustomModule: """Post-rpc interceptor for get_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_event_threat_detection_custom_module` interceptor runs + before the `post_get_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_get_event_threat_detection_custom_module_with_metadata( + self, + response: security_center_management.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_get_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_get_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_get_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_get_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_get_event_threat_detection_custom_module` will be passed to + `post_get_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_security_center_service( self, request: security_center_management.GetSecurityCenterServiceRequest, @@ -418,12 +548,38 @@ def post_get_security_center_service( ) -> security_center_management.SecurityCenterService: """Post-rpc interceptor for get_security_center_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_security_center_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_security_center_service` interceptor runs + before the `post_get_security_center_service_with_metadata` interceptor. """ return response + def post_get_security_center_service_with_metadata( + self, + response: security_center_management.SecurityCenterService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SecurityCenterService, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_security_center_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_get_security_center_service_with_metadata` + interceptor in new development instead of the `post_get_security_center_service` interceptor. + When both interceptors are used, this `post_get_security_center_service_with_metadata` interceptor runs after the + `post_get_security_center_service` interceptor. The (possibly modified) response returned by + `post_get_security_center_service` will be passed to + `post_get_security_center_service_with_metadata`. + """ + return response, metadata + def pre_get_security_health_analytics_custom_module( self, request: security_center_management.GetSecurityHealthAnalyticsCustomModuleRequest, @@ -444,12 +600,38 @@ def post_get_security_health_analytics_custom_module( ) -> security_center_management.SecurityHealthAnalyticsCustomModule: """Post-rpc interceptor for get_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_get_security_health_analytics_custom_module` interceptor runs + before the `post_get_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_get_security_health_analytics_custom_module_with_metadata( + self, + response: security_center_management.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for get_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_get_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_get_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_get_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_get_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_get_security_health_analytics_custom_module` will be passed to + `post_get_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_list_descendant_event_threat_detection_custom_modules( self, request: security_center_management.ListDescendantEventThreatDetectionCustomModulesRequest, @@ -473,12 +655,38 @@ def post_list_descendant_event_threat_detection_custom_modules( ): """Post-rpc interceptor for list_descendant_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_descendant_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_descendant_event_threat_detection_custom_modules` interceptor runs + before the `post_list_descendant_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_descendant_event_threat_detection_custom_modules_with_metadata( + self, + response: security_center_management.ListDescendantEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListDescendantEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_descendant_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_descendant_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_descendant_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_descendant_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_descendant_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_descendant_event_threat_detection_custom_modules` will be passed to + `post_list_descendant_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_descendant_security_health_analytics_custom_modules( self, request: security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesRequest, @@ -502,12 +710,38 @@ def post_list_descendant_security_health_analytics_custom_modules( ): """Post-rpc interceptor for list_descendant_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_descendant_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_descendant_security_health_analytics_custom_modules` interceptor runs + before the `post_list_descendant_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_descendant_security_health_analytics_custom_modules_with_metadata( + self, + response: security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_descendant_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_descendant_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_descendant_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_descendant_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_descendant_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_descendant_security_health_analytics_custom_modules` will be passed to + `post_list_descendant_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_effective_event_threat_detection_custom_modules( self, request: security_center_management.ListEffectiveEventThreatDetectionCustomModulesRequest, @@ -531,12 +765,38 @@ def post_list_effective_event_threat_detection_custom_modules( ): """Post-rpc interceptor for list_effective_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_effective_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_effective_event_threat_detection_custom_modules` interceptor runs + before the `post_list_effective_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_effective_event_threat_detection_custom_modules_with_metadata( + self, + response: security_center_management.ListEffectiveEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListEffectiveEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_effective_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_effective_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_effective_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_effective_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_effective_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_effective_event_threat_detection_custom_modules` will be passed to + `post_list_effective_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_effective_security_health_analytics_custom_modules( self, request: security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest, @@ -560,12 +820,38 @@ def post_list_effective_security_health_analytics_custom_modules( ): """Post-rpc interceptor for list_effective_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_effective_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_effective_security_health_analytics_custom_modules` interceptor runs + before the `post_list_effective_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_effective_security_health_analytics_custom_modules_with_metadata( + self, + response: security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_effective_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_effective_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_effective_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_effective_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_effective_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_effective_security_health_analytics_custom_modules` will be passed to + `post_list_effective_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_event_threat_detection_custom_modules( self, request: security_center_management.ListEventThreatDetectionCustomModulesRequest, @@ -587,12 +873,38 @@ def post_list_event_threat_detection_custom_modules( ) -> security_center_management.ListEventThreatDetectionCustomModulesResponse: """Post-rpc interceptor for list_event_threat_detection_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_event_threat_detection_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_event_threat_detection_custom_modules` interceptor runs + before the `post_list_event_threat_detection_custom_modules_with_metadata` interceptor. """ return response + def post_list_event_threat_detection_custom_modules_with_metadata( + self, + response: security_center_management.ListEventThreatDetectionCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListEventThreatDetectionCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_event_threat_detection_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_event_threat_detection_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_event_threat_detection_custom_modules` interceptor. + When both interceptors are used, this `post_list_event_threat_detection_custom_modules_with_metadata` interceptor runs after the + `post_list_event_threat_detection_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_event_threat_detection_custom_modules` will be passed to + `post_list_event_threat_detection_custom_modules_with_metadata`. + """ + return response, metadata + def pre_list_security_center_services( self, request: security_center_management.ListSecurityCenterServicesRequest, @@ -613,12 +925,38 @@ def post_list_security_center_services( ) -> security_center_management.ListSecurityCenterServicesResponse: """Post-rpc interceptor for list_security_center_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_security_center_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_security_center_services` interceptor runs + before the `post_list_security_center_services_with_metadata` interceptor. """ return response + def post_list_security_center_services_with_metadata( + self, + response: security_center_management.ListSecurityCenterServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListSecurityCenterServicesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_security_center_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_security_center_services_with_metadata` + interceptor in new development instead of the `post_list_security_center_services` interceptor. + When both interceptors are used, this `post_list_security_center_services_with_metadata` interceptor runs after the + `post_list_security_center_services` interceptor. The (possibly modified) response returned by + `post_list_security_center_services` will be passed to + `post_list_security_center_services_with_metadata`. + """ + return response, metadata + def pre_list_security_health_analytics_custom_modules( self, request: security_center_management.ListSecurityHealthAnalyticsCustomModulesRequest, @@ -640,12 +978,38 @@ def post_list_security_health_analytics_custom_modules( ) -> security_center_management.ListSecurityHealthAnalyticsCustomModulesResponse: """Post-rpc interceptor for list_security_health_analytics_custom_modules - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_security_health_analytics_custom_modules_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_list_security_health_analytics_custom_modules` interceptor runs + before the `post_list_security_health_analytics_custom_modules_with_metadata` interceptor. """ return response + def post_list_security_health_analytics_custom_modules_with_metadata( + self, + response: security_center_management.ListSecurityHealthAnalyticsCustomModulesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ListSecurityHealthAnalyticsCustomModulesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_security_health_analytics_custom_modules + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_list_security_health_analytics_custom_modules_with_metadata` + interceptor in new development instead of the `post_list_security_health_analytics_custom_modules` interceptor. + When both interceptors are used, this `post_list_security_health_analytics_custom_modules_with_metadata` interceptor runs after the + `post_list_security_health_analytics_custom_modules` interceptor. The (possibly modified) response returned by + `post_list_security_health_analytics_custom_modules` will be passed to + `post_list_security_health_analytics_custom_modules_with_metadata`. + """ + return response, metadata + def pre_simulate_security_health_analytics_custom_module( self, request: security_center_management.SimulateSecurityHealthAnalyticsCustomModuleRequest, @@ -667,12 +1031,38 @@ def post_simulate_security_health_analytics_custom_module( ) -> security_center_management.SimulateSecurityHealthAnalyticsCustomModuleResponse: """Post-rpc interceptor for simulate_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_simulate_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_simulate_security_health_analytics_custom_module` interceptor runs + before the `post_simulate_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_simulate_security_health_analytics_custom_module_with_metadata( + self, + response: security_center_management.SimulateSecurityHealthAnalyticsCustomModuleResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SimulateSecurityHealthAnalyticsCustomModuleResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for simulate_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_simulate_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_simulate_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_simulate_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_simulate_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_simulate_security_health_analytics_custom_module` will be passed to + `post_simulate_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_update_event_threat_detection_custom_module( self, request: security_center_management.UpdateEventThreatDetectionCustomModuleRequest, @@ -693,12 +1083,38 @@ def post_update_event_threat_detection_custom_module( ) -> security_center_management.EventThreatDetectionCustomModule: """Post-rpc interceptor for update_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_event_threat_detection_custom_module` interceptor runs + before the `post_update_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_update_event_threat_detection_custom_module_with_metadata( + self, + response: security_center_management.EventThreatDetectionCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.EventThreatDetectionCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_update_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_update_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_update_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_update_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_update_event_threat_detection_custom_module` will be passed to + `post_update_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_update_security_center_service( self, request: security_center_management.UpdateSecurityCenterServiceRequest, @@ -719,12 +1135,38 @@ def post_update_security_center_service( ) -> security_center_management.SecurityCenterService: """Post-rpc interceptor for update_security_center_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_center_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_security_center_service` interceptor runs + before the `post_update_security_center_service_with_metadata` interceptor. """ return response + def post_update_security_center_service_with_metadata( + self, + response: security_center_management.SecurityCenterService, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SecurityCenterService, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_security_center_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_update_security_center_service_with_metadata` + interceptor in new development instead of the `post_update_security_center_service` interceptor. + When both interceptors are used, this `post_update_security_center_service_with_metadata` interceptor runs after the + `post_update_security_center_service` interceptor. The (possibly modified) response returned by + `post_update_security_center_service` will be passed to + `post_update_security_center_service_with_metadata`. + """ + return response, metadata + def pre_update_security_health_analytics_custom_module( self, request: security_center_management.UpdateSecurityHealthAnalyticsCustomModuleRequest, @@ -745,12 +1187,38 @@ def post_update_security_health_analytics_custom_module( ) -> security_center_management.SecurityHealthAnalyticsCustomModule: """Post-rpc interceptor for update_security_health_analytics_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_security_health_analytics_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_update_security_health_analytics_custom_module` interceptor runs + before the `post_update_security_health_analytics_custom_module_with_metadata` interceptor. """ return response + def post_update_security_health_analytics_custom_module_with_metadata( + self, + response: security_center_management.SecurityHealthAnalyticsCustomModule, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.SecurityHealthAnalyticsCustomModule, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for update_security_health_analytics_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_update_security_health_analytics_custom_module_with_metadata` + interceptor in new development instead of the `post_update_security_health_analytics_custom_module` interceptor. + When both interceptors are used, this `post_update_security_health_analytics_custom_module_with_metadata` interceptor runs after the + `post_update_security_health_analytics_custom_module` interceptor. The (possibly modified) response returned by + `post_update_security_health_analytics_custom_module` will be passed to + `post_update_security_health_analytics_custom_module_with_metadata`. + """ + return response, metadata + def pre_validate_event_threat_detection_custom_module( self, request: security_center_management.ValidateEventThreatDetectionCustomModuleRequest, @@ -772,12 +1240,38 @@ def post_validate_event_threat_detection_custom_module( ) -> security_center_management.ValidateEventThreatDetectionCustomModuleResponse: """Post-rpc interceptor for validate_event_threat_detection_custom_module - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_validate_event_threat_detection_custom_module_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the SecurityCenterManagement server but before - it is returned to user code. + it is returned to user code. This `post_validate_event_threat_detection_custom_module` interceptor runs + before the `post_validate_event_threat_detection_custom_module_with_metadata` interceptor. """ return response + def post_validate_event_threat_detection_custom_module_with_metadata( + self, + response: security_center_management.ValidateEventThreatDetectionCustomModuleResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + security_center_management.ValidateEventThreatDetectionCustomModuleResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for validate_event_threat_detection_custom_module + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the SecurityCenterManagement server but before it is returned to user code. + + We recommend only using this `post_validate_event_threat_detection_custom_module_with_metadata` + interceptor in new development instead of the `post_validate_event_threat_detection_custom_module` interceptor. + When both interceptors are used, this `post_validate_event_threat_detection_custom_module_with_metadata` interceptor runs after the + `post_validate_event_threat_detection_custom_module` interceptor. The (possibly modified) response returned by + `post_validate_event_threat_detection_custom_module` will be passed to + `post_validate_event_threat_detection_custom_module_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1058,6 +1552,13 @@ def __call__( resp = self._interceptor.post_create_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1232,6 +1733,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_create_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1633,6 +2141,13 @@ def __call__( resp = self._interceptor.post_get_effective_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_effective_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1801,6 +2316,13 @@ def __call__( resp = self._interceptor.post_get_effective_security_health_analytics_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_effective_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1961,6 +2483,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_event_threat_detection_custom_module(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2120,6 +2649,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_security_center_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_security_center_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2288,6 +2821,13 @@ def __call__( resp = self._interceptor.post_get_security_health_analytics_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_get_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2450,6 +2990,13 @@ def __call__( resp = self._interceptor.post_list_descendant_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_descendant_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2612,6 +3159,13 @@ def __call__( resp = self._interceptor.post_list_descendant_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_descendant_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2774,6 +3328,13 @@ def __call__( resp = self._interceptor.post_list_effective_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_effective_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2936,6 +3497,13 @@ def __call__( resp = self._interceptor.post_list_effective_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_effective_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3096,6 +3664,13 @@ def __call__( resp = self._interceptor.post_list_event_threat_detection_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_event_threat_detection_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3249,6 +3824,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_security_center_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_security_center_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3411,6 +3993,13 @@ def __call__( resp = self._interceptor.post_list_security_health_analytics_custom_modules( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_list_security_health_analytics_custom_modules_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3582,6 +4171,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_simulate_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3750,6 +4346,13 @@ def __call__( resp = self._interceptor.post_update_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3915,6 +4518,13 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_security_center_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_security_center_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4091,6 +4701,13 @@ def __call__( resp ) ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_update_security_health_analytics_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4259,6 +4876,13 @@ def __call__( resp = self._interceptor.post_validate_event_threat_detection_custom_module( resp ) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + ( + resp, + _, + ) = self._interceptor.post_validate_event_threat_detection_custom_module_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json b/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json index e8096dc2bd4c..aa268d46e53c 100644 --- a/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json +++ b/packages/google-cloud-securitycentermanagement/samples/generated_samples/snippet_metadata_google.cloud.securitycentermanagement.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-securitycentermanagement", - "version": "0.1.18" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-securitycentermanagement/tests/unit/gapic/securitycentermanagement_v1/test_security_center_management.py b/packages/google-cloud-securitycentermanagement/tests/unit/gapic/securitycentermanagement_v1/test_security_center_management.py index fd50a93af944..4f8b112ea9cc 100644 --- a/packages/google-cloud-securitycentermanagement/tests/unit/gapic/securitycentermanagement_v1/test_security_center_management.py +++ b/packages/google-cloud-securitycentermanagement/tests/unit/gapic/securitycentermanagement_v1/test_security_center_management.py @@ -66,6 +66,13 @@ ) from google.cloud.securitycentermanagement_v1.types import security_center_management +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -341,6 +348,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = SecurityCenterManagementClient(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 = SecurityCenterManagementClient(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", [ @@ -16999,11 +17049,15 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto transports.SecurityCenterManagementRestInterceptor, "post_list_effective_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_effective_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_effective_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest.pb( security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesRequest() ) @@ -17033,6 +17087,10 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto post.return_value = ( security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListEffectiveSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_effective_security_health_analytics_custom_modules( request, @@ -17044,6 +17102,7 @@ def test_list_effective_security_health_analytics_custom_modules_rest_intercepto pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_security_health_analytics_custom_module_rest_bad_request( @@ -17151,11 +17210,15 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors transports.SecurityCenterManagementRestInterceptor, "post_get_effective_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_get_effective_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_get_effective_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest.pb( security_center_management.GetEffectiveSecurityHealthAnalyticsCustomModuleRequest() ) @@ -17185,6 +17248,10 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors post.return_value = ( security_center_management.EffectiveSecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.EffectiveSecurityHealthAnalyticsCustomModule(), + metadata, + ) client.get_effective_security_health_analytics_custom_module( request, @@ -17196,6 +17263,7 @@ def test_get_effective_security_health_analytics_custom_module_rest_interceptors pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_security_health_analytics_custom_modules_rest_bad_request( @@ -17287,11 +17355,15 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_list_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListSecurityHealthAnalyticsCustomModulesRequest.pb( security_center_management.ListSecurityHealthAnalyticsCustomModulesRequest() ) @@ -17321,6 +17393,10 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( post.return_value = ( security_center_management.ListSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_security_health_analytics_custom_modules( request, @@ -17332,6 +17408,7 @@ def test_list_security_health_analytics_custom_modules_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_descendant_security_health_analytics_custom_modules_rest_bad_request( @@ -17427,11 +17504,15 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept transports.SecurityCenterManagementRestInterceptor, "post_list_descendant_security_health_analytics_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_descendant_security_health_analytics_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_descendant_security_health_analytics_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesRequest.pb( security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesRequest() ) @@ -17461,6 +17542,10 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept post.return_value = ( security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListDescendantSecurityHealthAnalyticsCustomModulesResponse(), + metadata, + ) client.list_descendant_security_health_analytics_custom_modules( request, @@ -17472,6 +17557,7 @@ def test_list_descendant_security_health_analytics_custom_modules_rest_intercept pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_security_health_analytics_custom_module_rest_bad_request( @@ -17580,11 +17666,15 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_get_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_get_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_get_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.GetSecurityHealthAnalyticsCustomModuleRequest.pb( security_center_management.GetSecurityHealthAnalyticsCustomModuleRequest() ) @@ -17616,6 +17706,10 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( security_center_management.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.get_security_health_analytics_custom_module( request, @@ -17627,6 +17721,7 @@ def test_get_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_security_health_analytics_custom_module_rest_bad_request( @@ -17834,11 +17929,15 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_create_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_create_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_create_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.CreateSecurityHealthAnalyticsCustomModuleRequest.pb( security_center_management.CreateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -17870,6 +17969,10 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( security_center_management.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.create_security_health_analytics_custom_module( request, @@ -17881,6 +17984,7 @@ def test_create_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_health_analytics_custom_module_rest_bad_request( @@ -18096,11 +18200,15 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_update_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_update_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_update_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.UpdateSecurityHealthAnalyticsCustomModuleRequest.pb( security_center_management.UpdateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -18132,6 +18240,10 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( security_center_management.SecurityHealthAnalyticsCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.SecurityHealthAnalyticsCustomModule(), + metadata, + ) client.update_security_health_analytics_custom_module( request, @@ -18143,6 +18255,7 @@ def test_update_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_security_health_analytics_custom_module_rest_bad_request( @@ -18354,11 +18467,15 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_simulate_security_health_analytics_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_simulate_security_health_analytics_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_simulate_security_health_analytics_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.SimulateSecurityHealthAnalyticsCustomModuleRequest.pb( security_center_management.SimulateSecurityHealthAnalyticsCustomModuleRequest() ) @@ -18388,6 +18505,10 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( post.return_value = ( security_center_management.SimulateSecurityHealthAnalyticsCustomModuleResponse() ) + post_with_metadata.return_value = ( + security_center_management.SimulateSecurityHealthAnalyticsCustomModuleResponse(), + metadata, + ) client.simulate_security_health_analytics_custom_module( request, @@ -18399,6 +18520,7 @@ def test_simulate_security_health_analytics_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_effective_event_threat_detection_custom_modules_rest_bad_request( @@ -18492,11 +18614,15 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_list_effective_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_effective_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_effective_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListEffectiveEventThreatDetectionCustomModulesRequest.pb( security_center_management.ListEffectiveEventThreatDetectionCustomModulesRequest() ) @@ -18526,6 +18652,10 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( post.return_value = ( security_center_management.ListEffectiveEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListEffectiveEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_effective_event_threat_detection_custom_modules( request, @@ -18537,6 +18667,7 @@ def test_list_effective_event_threat_detection_custom_modules_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_effective_event_threat_detection_custom_module_rest_bad_request( @@ -18647,11 +18778,15 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_get_effective_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_get_effective_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_get_effective_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.GetEffectiveEventThreatDetectionCustomModuleRequest.pb( security_center_management.GetEffectiveEventThreatDetectionCustomModuleRequest() ) @@ -18681,6 +18816,10 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( security_center_management.EffectiveEventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.EffectiveEventThreatDetectionCustomModule(), + metadata, + ) client.get_effective_event_threat_detection_custom_module( request, @@ -18692,6 +18831,7 @@ def test_get_effective_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_event_threat_detection_custom_modules_rest_bad_request( @@ -18783,11 +18923,15 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter transports.SecurityCenterManagementRestInterceptor, "post_list_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListEventThreatDetectionCustomModulesRequest.pb( security_center_management.ListEventThreatDetectionCustomModulesRequest() ) @@ -18817,6 +18961,10 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter post.return_value = ( security_center_management.ListEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_event_threat_detection_custom_modules( request, @@ -18828,6 +18976,7 @@ def test_list_event_threat_detection_custom_modules_rest_interceptors(null_inter pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_descendant_event_threat_detection_custom_modules_rest_bad_request( @@ -18921,11 +19070,15 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors transports.SecurityCenterManagementRestInterceptor, "post_list_descendant_event_threat_detection_custom_modules", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_descendant_event_threat_detection_custom_modules_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_descendant_event_threat_detection_custom_modules", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListDescendantEventThreatDetectionCustomModulesRequest.pb( security_center_management.ListDescendantEventThreatDetectionCustomModulesRequest() ) @@ -18955,6 +19108,10 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors post.return_value = ( security_center_management.ListDescendantEventThreatDetectionCustomModulesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListDescendantEventThreatDetectionCustomModulesResponse(), + metadata, + ) client.list_descendant_event_threat_detection_custom_modules( request, @@ -18966,6 +19123,7 @@ def test_list_descendant_event_threat_detection_custom_modules_rest_interceptors pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_event_threat_detection_custom_module_rest_bad_request( @@ -19074,11 +19232,15 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce transports.SecurityCenterManagementRestInterceptor, "post_get_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_get_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_get_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = ( security_center_management.GetEventThreatDetectionCustomModuleRequest.pb( security_center_management.GetEventThreatDetectionCustomModuleRequest() @@ -19112,6 +19274,10 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce post.return_value = ( security_center_management.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.EventThreatDetectionCustomModule(), + metadata, + ) client.get_event_threat_detection_custom_module( request, @@ -19123,6 +19289,7 @@ def test_get_event_threat_detection_custom_module_rest_interceptors(null_interce pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_event_threat_detection_custom_module_rest_bad_request( @@ -19317,11 +19484,15 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_create_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_create_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_create_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.CreateEventThreatDetectionCustomModuleRequest.pb( security_center_management.CreateEventThreatDetectionCustomModuleRequest() ) @@ -19353,6 +19524,10 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( security_center_management.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.EventThreatDetectionCustomModule(), + metadata, + ) client.create_event_threat_detection_custom_module( request, @@ -19364,6 +19539,7 @@ def test_create_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_event_threat_detection_custom_module_rest_bad_request( @@ -19566,11 +19742,15 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_update_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_update_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_update_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.UpdateEventThreatDetectionCustomModuleRequest.pb( security_center_management.UpdateEventThreatDetectionCustomModuleRequest() ) @@ -19602,6 +19782,10 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( security_center_management.EventThreatDetectionCustomModule() ) + post_with_metadata.return_value = ( + security_center_management.EventThreatDetectionCustomModule(), + metadata, + ) client.update_event_threat_detection_custom_module( request, @@ -19613,6 +19797,7 @@ def test_update_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_event_threat_detection_custom_module_rest_bad_request( @@ -19822,11 +20007,15 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( transports.SecurityCenterManagementRestInterceptor, "post_validate_event_threat_detection_custom_module", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_validate_event_threat_detection_custom_module_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_validate_event_threat_detection_custom_module", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ValidateEventThreatDetectionCustomModuleRequest.pb( security_center_management.ValidateEventThreatDetectionCustomModuleRequest() ) @@ -19856,6 +20045,10 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( post.return_value = ( security_center_management.ValidateEventThreatDetectionCustomModuleResponse() ) + post_with_metadata.return_value = ( + security_center_management.ValidateEventThreatDetectionCustomModuleResponse(), + metadata, + ) client.validate_event_threat_detection_custom_module( request, @@ -19867,6 +20060,7 @@ def test_validate_event_threat_detection_custom_module_rest_interceptors( pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_security_center_service_rest_bad_request( @@ -19966,11 +20160,15 @@ def test_get_security_center_service_rest_interceptors(null_interceptor): transports.SecurityCenterManagementRestInterceptor, "post_get_security_center_service", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_get_security_center_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_get_security_center_service", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.GetSecurityCenterServiceRequest.pb( security_center_management.GetSecurityCenterServiceRequest() ) @@ -19996,6 +20194,10 @@ def test_get_security_center_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = security_center_management.SecurityCenterService() + post_with_metadata.return_value = ( + security_center_management.SecurityCenterService(), + metadata, + ) client.get_security_center_service( request, @@ -20007,6 +20209,7 @@ def test_get_security_center_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_security_center_services_rest_bad_request( @@ -20094,11 +20297,15 @@ def test_list_security_center_services_rest_interceptors(null_interceptor): transports.SecurityCenterManagementRestInterceptor, "post_list_security_center_services", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_list_security_center_services_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_list_security_center_services", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.ListSecurityCenterServicesRequest.pb( security_center_management.ListSecurityCenterServicesRequest() ) @@ -20128,6 +20335,10 @@ def test_list_security_center_services_rest_interceptors(null_interceptor): post.return_value = ( security_center_management.ListSecurityCenterServicesResponse() ) + post_with_metadata.return_value = ( + security_center_management.ListSecurityCenterServicesResponse(), + metadata, + ) client.list_security_center_services( request, @@ -20139,6 +20350,7 @@ def test_list_security_center_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_security_center_service_rest_bad_request( @@ -20323,11 +20535,15 @@ def test_update_security_center_service_rest_interceptors(null_interceptor): transports.SecurityCenterManagementRestInterceptor, "post_update_security_center_service", ) as post, mock.patch.object( + transports.SecurityCenterManagementRestInterceptor, + "post_update_security_center_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.SecurityCenterManagementRestInterceptor, "pre_update_security_center_service", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = security_center_management.UpdateSecurityCenterServiceRequest.pb( security_center_management.UpdateSecurityCenterServiceRequest() ) @@ -20353,6 +20569,10 @@ def test_update_security_center_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = security_center_management.SecurityCenterService() + post_with_metadata.return_value = ( + security_center_management.SecurityCenterService(), + metadata, + ) client.update_security_center_service( request, @@ -20364,6 +20584,7 @@ def test_update_security_center_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol/gapic_version.py b/packages/google-cloud-service-control/google/cloud/servicecontrol/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol/gapic_version.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/gapic_version.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/gapic_version.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/client.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/client.py index 460caa7387ce..a7c3c8a2a441 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/client.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/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 @@ -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-service-control/google/cloud/servicecontrol_v1/services/quota_controller/transports/rest.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/transports/rest.py index 309d49d3c851..cc4e256cfdc7 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/transports/rest.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/quota_controller/transports/rest.py @@ -101,12 +101,37 @@ def post_allocate_quota( ) -> quota_controller.AllocateQuotaResponse: """Post-rpc interceptor for allocate_quota - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_allocate_quota_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the QuotaController server but before - it is returned to user code. + it is returned to user code. This `post_allocate_quota` interceptor runs + before the `post_allocate_quota_with_metadata` interceptor. """ return response + def post_allocate_quota_with_metadata( + self, + response: quota_controller.AllocateQuotaResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + quota_controller.AllocateQuotaResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for allocate_quota + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the QuotaController server but before it is returned to user code. + + We recommend only using this `post_allocate_quota_with_metadata` + interceptor in new development instead of the `post_allocate_quota` interceptor. + When both interceptors are used, this `post_allocate_quota_with_metadata` interceptor runs after the + `post_allocate_quota` interceptor. The (possibly modified) response returned by + `post_allocate_quota` will be passed to + `post_allocate_quota_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class QuotaControllerRestStub: @@ -323,6 +348,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_allocate_quota(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_allocate_quota_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/client.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/client.py index 8f2abfe54994..b779661ee77c 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/client.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/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 @@ -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-service-control/google/cloud/servicecontrol_v1/services/service_controller/transports/rest.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/transports/rest.py index 2a8584187856..a2ced3d26f26 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/transports/rest.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v1/services/service_controller/transports/rest.py @@ -109,12 +109,37 @@ def post_check( ) -> service_controller.CheckResponse: """Post-rpc interceptor for check - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_check_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceController server but before - it is returned to user code. + it is returned to user code. This `post_check` interceptor runs + before the `post_check_with_metadata` interceptor. """ return response + def post_check_with_metadata( + self, + response: service_controller.CheckResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service_controller.CheckResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for check + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceController server but before it is returned to user code. + + We recommend only using this `post_check_with_metadata` + interceptor in new development instead of the `post_check` interceptor. + When both interceptors are used, this `post_check_with_metadata` interceptor runs after the + `post_check` interceptor. The (possibly modified) response returned by + `post_check` will be passed to + `post_check_with_metadata`. + """ + return response, metadata + def pre_report( self, request: service_controller.ReportRequest, @@ -134,12 +159,37 @@ def post_report( ) -> service_controller.ReportResponse: """Post-rpc interceptor for report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceController server but before - it is returned to user code. + it is returned to user code. This `post_report` interceptor runs + before the `post_report_with_metadata` interceptor. """ return response + def post_report_with_metadata( + self, + response: service_controller.ReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service_controller.ReportResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceController server but before it is returned to user code. + + We recommend only using this `post_report_with_metadata` + interceptor in new development instead of the `post_report` interceptor. + When both interceptors are used, this `post_report_with_metadata` interceptor runs after the + `post_report` interceptor. The (possibly modified) response returned by + `post_report` will be passed to + `post_report_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ServiceControllerRestStub: @@ -361,6 +411,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_check(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_check_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -518,6 +572,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/gapic_version.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/gapic_version.py index 2159c8af6f8e..558c8aab67c5 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/gapic_version.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.14.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/client.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/client.py index ee3524bcd9c6..75b412c9e706 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/client.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/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 @@ -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-service-control/google/cloud/servicecontrol_v2/services/service_controller/transports/rest.py b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/transports/rest.py index 8b268714a3dd..5542e49006ce 100644 --- a/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/transports/rest.py +++ b/packages/google-cloud-service-control/google/cloud/servicecontrol_v2/services/service_controller/transports/rest.py @@ -109,12 +109,37 @@ def post_check( ) -> service_controller.CheckResponse: """Post-rpc interceptor for check - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_check_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceController server but before - it is returned to user code. + it is returned to user code. This `post_check` interceptor runs + before the `post_check_with_metadata` interceptor. """ return response + def post_check_with_metadata( + self, + response: service_controller.CheckResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service_controller.CheckResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for check + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceController server but before it is returned to user code. + + We recommend only using this `post_check_with_metadata` + interceptor in new development instead of the `post_check` interceptor. + When both interceptors are used, this `post_check_with_metadata` interceptor runs after the + `post_check` interceptor. The (possibly modified) response returned by + `post_check` will be passed to + `post_check_with_metadata`. + """ + return response, metadata + def pre_report( self, request: service_controller.ReportRequest, @@ -134,12 +159,37 @@ def post_report( ) -> service_controller.ReportResponse: """Post-rpc interceptor for report - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_report_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceController server but before - it is returned to user code. + it is returned to user code. This `post_report` interceptor runs + before the `post_report_with_metadata` interceptor. """ return response + def post_report_with_metadata( + self, + response: service_controller.ReportResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + service_controller.ReportResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for report + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceController server but before it is returned to user code. + + We recommend only using this `post_report_with_metadata` + interceptor in new development instead of the `post_report` interceptor. + When both interceptors are used, this `post_report_with_metadata` interceptor runs after the + `post_report` interceptor. The (possibly modified) response returned by + `post_report` will be passed to + `post_report_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class ServiceControllerRestStub: @@ -366,6 +416,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_check(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_check_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -525,6 +579,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_report(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_report_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v1.json b/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v1.json index 6ad472c6bf41..aec69298eea8 100644 --- a/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v1.json +++ b/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-control", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v2.json b/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v2.json index 8ea1db961fa8..d3f8d10a4782 100644 --- a/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v2.json +++ b/packages/google-cloud-service-control/samples/generated_samples/snippet_metadata_google.api.servicecontrol.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-control", - "version": "1.14.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_quota_controller.py b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_quota_controller.py index bca133e5588b..c59e4e852c5b 100644 --- a/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_quota_controller.py +++ b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_quota_controller.py @@ -63,6 +63,13 @@ from google.cloud.servicecontrol_v1.types import distribution as gas_distribution from google.cloud.servicecontrol_v1.types import metric_value, quota_controller +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -321,6 +328,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = QuotaControllerClient(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 = QuotaControllerClient(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", [ @@ -1633,10 +1683,13 @@ def test_allocate_quota_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.QuotaControllerRestInterceptor, "post_allocate_quota" ) as post, mock.patch.object( + transports.QuotaControllerRestInterceptor, "post_allocate_quota_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.QuotaControllerRestInterceptor, "pre_allocate_quota" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = quota_controller.AllocateQuotaRequest.pb( quota_controller.AllocateQuotaRequest() ) @@ -1662,6 +1715,10 @@ def test_allocate_quota_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = quota_controller.AllocateQuotaResponse() + post_with_metadata.return_value = ( + quota_controller.AllocateQuotaResponse(), + metadata, + ) client.allocate_quota( request, @@ -1673,6 +1730,7 @@ def test_allocate_quota_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-service-control/tests/unit/gapic/servicecontrol_v1/test_service_controller.py b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_service_controller.py index 375d4a88266d..0ef530dd09d8 100644 --- a/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_service_controller.py +++ b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v1/test_service_controller.py @@ -73,6 +73,13 @@ from google.cloud.servicecontrol_v1.types import distribution as gas_distribution from google.cloud.servicecontrol_v1.types import check_error +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 = ServiceControllerClient(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 = ServiceControllerClient(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", [ @@ -1990,10 +2040,13 @@ def test_check_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceControllerRestInterceptor, "post_check" ) as post, mock.patch.object( + transports.ServiceControllerRestInterceptor, "post_check_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceControllerRestInterceptor, "pre_check" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service_controller.CheckRequest.pb( service_controller.CheckRequest() ) @@ -2019,6 +2072,7 @@ def test_check_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service_controller.CheckResponse() + post_with_metadata.return_value = service_controller.CheckResponse(), metadata client.check( request, @@ -2030,6 +2084,7 @@ def test_check_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_report_rest_bad_request(request_type=service_controller.ReportRequest): @@ -2114,10 +2169,13 @@ def test_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceControllerRestInterceptor, "post_report" ) as post, mock.patch.object( + transports.ServiceControllerRestInterceptor, "post_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceControllerRestInterceptor, "pre_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service_controller.ReportRequest.pb( service_controller.ReportRequest() ) @@ -2143,6 +2201,7 @@ def test_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service_controller.ReportResponse() + post_with_metadata.return_value = service_controller.ReportResponse(), metadata client.report( request, @@ -2154,6 +2213,7 @@ def test_report_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-service-control/tests/unit/gapic/servicecontrol_v2/test_service_controller.py b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v2/test_service_controller.py index 8ca87ebe2385..3c6f05ad203f 100644 --- a/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v2/test_service_controller.py +++ b/packages/google-cloud-service-control/tests/unit/gapic/servicecontrol_v2/test_service_controller.py @@ -65,6 +65,13 @@ ) from google.cloud.servicecontrol_v2.types import service_controller +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 = ServiceControllerClient(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 = ServiceControllerClient(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_check_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceControllerRestInterceptor, "post_check" ) as post, mock.patch.object( + transports.ServiceControllerRestInterceptor, "post_check_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceControllerRestInterceptor, "pre_check" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service_controller.CheckRequest.pb( service_controller.CheckRequest() ) @@ -1975,6 +2028,7 @@ def test_check_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service_controller.CheckResponse() + post_with_metadata.return_value = service_controller.CheckResponse(), metadata client.check( request, @@ -1986,6 +2040,7 @@ def test_check_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_report_rest_bad_request(request_type=service_controller.ReportRequest): @@ -2065,10 +2120,13 @@ def test_report_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceControllerRestInterceptor, "post_report" ) as post, mock.patch.object( + transports.ServiceControllerRestInterceptor, "post_report_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceControllerRestInterceptor, "pre_report" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = service_controller.ReportRequest.pb( service_controller.ReportRequest() ) @@ -2094,6 +2152,7 @@ def test_report_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service_controller.ReportResponse() + post_with_metadata.return_value = service_controller.ReportResponse(), metadata client.report( request, @@ -2105,6 +2164,7 @@ def test_report_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-service-directory/google/cloud/servicedirectory/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/client.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/client.py index 28468417e9ce..aa2b9a6b22bc 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/client.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -531,6 +533,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. @@ -872,16 +901,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -927,16 +960,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/transports/rest.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/transports/rest.py index 2149ef03d106..a581d81cf96b 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/transports/rest.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/lookup_service/transports/rest.py @@ -102,12 +102,37 @@ def post_resolve_service( ) -> lookup_service.ResolveServiceResponse: """Post-rpc interceptor for resolve_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resolve_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LookupService server but before - it is returned to user code. + it is returned to user code. This `post_resolve_service` interceptor runs + before the `post_resolve_service_with_metadata` interceptor. """ return response + def post_resolve_service_with_metadata( + self, + response: lookup_service.ResolveServiceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + lookup_service.ResolveServiceResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for resolve_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LookupService server but before it is returned to user code. + + We recommend only using this `post_resolve_service_with_metadata` + interceptor in new development instead of the `post_resolve_service` interceptor. + When both interceptors are used, this `post_resolve_service_with_metadata` interceptor runs after the + `post_resolve_service` interceptor. The (possibly modified) response returned by + `post_resolve_service` will be passed to + `post_resolve_service_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -373,6 +398,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resolve_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resolve_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/client.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/client.py index 98369b2d67a7..d9a6180b255d 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/client.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -580,6 +582,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. @@ -2897,16 +2926,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2952,16 +2985,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/transports/rest.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/transports/rest.py index a3de71c5bbce..0aafe4f808b1 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/transports/rest.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1/services/registration_service/transports/rest.py @@ -236,12 +236,35 @@ def post_create_endpoint( ) -> gcs_endpoint.Endpoint: """Post-rpc interceptor for create_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_endpoint` interceptor runs + before the `post_create_endpoint_with_metadata` interceptor. """ return response + def post_create_endpoint_with_metadata( + self, + response: gcs_endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_endpoint_with_metadata` + interceptor in new development instead of the `post_create_endpoint` interceptor. + When both interceptors are used, this `post_create_endpoint_with_metadata` interceptor runs after the + `post_create_endpoint` interceptor. The (possibly modified) response returned by + `post_create_endpoint` will be passed to + `post_create_endpoint_with_metadata`. + """ + return response, metadata + def pre_create_namespace( self, request: registration_service.CreateNamespaceRequest, @@ -262,12 +285,35 @@ def post_create_namespace( ) -> gcs_namespace.Namespace: """Post-rpc interceptor for create_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_namespace` interceptor runs + before the `post_create_namespace_with_metadata` interceptor. """ return response + def post_create_namespace_with_metadata( + self, + response: gcs_namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_namespace_with_metadata` + interceptor in new development instead of the `post_create_namespace` interceptor. + When both interceptors are used, this `post_create_namespace_with_metadata` interceptor runs after the + `post_create_namespace` interceptor. The (possibly modified) response returned by + `post_create_namespace` will be passed to + `post_create_namespace_with_metadata`. + """ + return response, metadata + def pre_create_service( self, request: registration_service.CreateServiceRequest, @@ -286,12 +332,35 @@ def pre_create_service( def post_create_service(self, response: gcs_service.Service) -> gcs_service.Service: """Post-rpc interceptor for create_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_service` interceptor runs + before the `post_create_service_with_metadata` interceptor. """ return response + def post_create_service_with_metadata( + self, + response: gcs_service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_service_with_metadata` + interceptor in new development instead of the `post_create_service` interceptor. + When both interceptors are used, this `post_create_service_with_metadata` interceptor runs after the + `post_create_service` interceptor. The (possibly modified) response returned by + `post_create_service` will be passed to + `post_create_service_with_metadata`. + """ + return response, metadata + def pre_delete_endpoint( self, request: registration_service.DeleteEndpointRequest, @@ -354,12 +423,35 @@ def pre_get_endpoint( def post_get_endpoint(self, response: endpoint.Endpoint) -> endpoint.Endpoint: """Post-rpc interceptor for get_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_endpoint` interceptor runs + before the `post_get_endpoint_with_metadata` interceptor. """ return response + def post_get_endpoint_with_metadata( + self, + response: endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_endpoint_with_metadata` + interceptor in new development instead of the `post_get_endpoint` interceptor. + When both interceptors are used, this `post_get_endpoint_with_metadata` interceptor runs after the + `post_get_endpoint` interceptor. The (possibly modified) response returned by + `post_get_endpoint` will be passed to + `post_get_endpoint_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -377,12 +469,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService 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_namespace( self, request: registration_service.GetNamespaceRequest, @@ -401,12 +516,35 @@ def pre_get_namespace( def post_get_namespace(self, response: namespace.Namespace) -> namespace.Namespace: """Post-rpc interceptor for get_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_namespace` interceptor runs + before the `post_get_namespace_with_metadata` interceptor. """ return response + def post_get_namespace_with_metadata( + self, + response: namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_namespace_with_metadata` + interceptor in new development instead of the `post_get_namespace` interceptor. + When both interceptors are used, this `post_get_namespace_with_metadata` interceptor runs after the + `post_get_namespace` interceptor. The (possibly modified) response returned by + `post_get_namespace` will be passed to + `post_get_namespace_with_metadata`. + """ + return response, metadata + def pre_get_service( self, request: registration_service.GetServiceRequest, @@ -424,12 +562,35 @@ def pre_get_service( def post_get_service(self, response: service.Service) -> service.Service: """Post-rpc interceptor for get_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_service` interceptor runs + before the `post_get_service_with_metadata` interceptor. """ return response + def post_get_service_with_metadata( + self, + response: service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_service_with_metadata` + interceptor in new development instead of the `post_get_service` interceptor. + When both interceptors are used, this `post_get_service_with_metadata` interceptor runs after the + `post_get_service` interceptor. The (possibly modified) response returned by + `post_get_service` will be passed to + `post_get_service_with_metadata`. + """ + return response, metadata + def pre_list_endpoints( self, request: registration_service.ListEndpointsRequest, @@ -450,12 +611,38 @@ def post_list_endpoints( ) -> registration_service.ListEndpointsResponse: """Post-rpc interceptor for list_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_endpoints` interceptor runs + before the `post_list_endpoints_with_metadata` interceptor. """ return response + def post_list_endpoints_with_metadata( + self, + response: registration_service.ListEndpointsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListEndpointsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_endpoints_with_metadata` + interceptor in new development instead of the `post_list_endpoints` interceptor. + When both interceptors are used, this `post_list_endpoints_with_metadata` interceptor runs after the + `post_list_endpoints` interceptor. The (possibly modified) response returned by + `post_list_endpoints` will be passed to + `post_list_endpoints_with_metadata`. + """ + return response, metadata + def pre_list_namespaces( self, request: registration_service.ListNamespacesRequest, @@ -476,12 +663,38 @@ def post_list_namespaces( ) -> registration_service.ListNamespacesResponse: """Post-rpc interceptor for list_namespaces - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_namespaces_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_namespaces` interceptor runs + before the `post_list_namespaces_with_metadata` interceptor. """ return response + def post_list_namespaces_with_metadata( + self, + response: registration_service.ListNamespacesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListNamespacesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_namespaces + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_namespaces_with_metadata` + interceptor in new development instead of the `post_list_namespaces` interceptor. + When both interceptors are used, this `post_list_namespaces_with_metadata` interceptor runs after the + `post_list_namespaces` interceptor. The (possibly modified) response returned by + `post_list_namespaces` will be passed to + `post_list_namespaces_with_metadata`. + """ + return response, metadata + def pre_list_services( self, request: registration_service.ListServicesRequest, @@ -502,12 +715,38 @@ def post_list_services( ) -> registration_service.ListServicesResponse: """Post-rpc interceptor for list_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_services` interceptor runs + before the `post_list_services_with_metadata` interceptor. """ return response + def post_list_services_with_metadata( + self, + response: registration_service.ListServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListServicesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_services_with_metadata` + interceptor in new development instead of the `post_list_services` interceptor. + When both interceptors are used, this `post_list_services_with_metadata` interceptor runs after the + `post_list_services` interceptor. The (possibly modified) response returned by + `post_list_services` will be passed to + `post_list_services_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -525,12 +764,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -551,12 +813,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService 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_endpoint( self, request: registration_service.UpdateEndpointRequest, @@ -577,12 +865,35 @@ def post_update_endpoint( ) -> gcs_endpoint.Endpoint: """Post-rpc interceptor for update_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_endpoint` interceptor runs + before the `post_update_endpoint_with_metadata` interceptor. """ return response + def post_update_endpoint_with_metadata( + self, + response: gcs_endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_endpoint_with_metadata` + interceptor in new development instead of the `post_update_endpoint` interceptor. + When both interceptors are used, this `post_update_endpoint_with_metadata` interceptor runs after the + `post_update_endpoint` interceptor. The (possibly modified) response returned by + `post_update_endpoint` will be passed to + `post_update_endpoint_with_metadata`. + """ + return response, metadata + def pre_update_namespace( self, request: registration_service.UpdateNamespaceRequest, @@ -603,12 +914,35 @@ def post_update_namespace( ) -> gcs_namespace.Namespace: """Post-rpc interceptor for update_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_namespace` interceptor runs + before the `post_update_namespace_with_metadata` interceptor. """ return response + def post_update_namespace_with_metadata( + self, + response: gcs_namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_namespace_with_metadata` + interceptor in new development instead of the `post_update_namespace` interceptor. + When both interceptors are used, this `post_update_namespace_with_metadata` interceptor runs after the + `post_update_namespace` interceptor. The (possibly modified) response returned by + `post_update_namespace` will be passed to + `post_update_namespace_with_metadata`. + """ + return response, metadata + def pre_update_service( self, request: registration_service.UpdateServiceRequest, @@ -627,12 +961,35 @@ def pre_update_service( def post_update_service(self, response: gcs_service.Service) -> gcs_service.Service: """Post-rpc interceptor for update_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_service` interceptor runs + before the `post_update_service_with_metadata` interceptor. """ return response + def post_update_service_with_metadata( + self, + response: gcs_service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_service_with_metadata` + interceptor in new development instead of the `post_update_service` interceptor. + When both interceptors are used, this `post_update_service_with_metadata` interceptor runs after the + `post_update_service` interceptor. The (possibly modified) response returned by + `post_update_service` will be passed to + `post_update_service_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -912,6 +1269,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1067,6 +1428,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1219,6 +1584,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1692,6 +2061,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1914,6 +2287,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 @@ -2061,6 +2438,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2210,6 +2591,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2354,6 +2739,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2500,6 +2889,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_namespaces(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_namespaces_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2646,6 +3039,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2870,6 +3267,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 @@ -3021,6 +3422,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 @@ -3172,6 +3577,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3327,6 +3736,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3479,6 +3892,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py index 43155ded0db3..558c8aab67c5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.13.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/client.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/client.py index 9ac49f0a52cb..2c9f56cd9ab5 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/client.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -531,6 +533,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. @@ -873,16 +902,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -928,16 +961,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/transports/rest.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/transports/rest.py index b405a482970a..f9ca1b25e88e 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/transports/rest.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/lookup_service/transports/rest.py @@ -102,12 +102,37 @@ def post_resolve_service( ) -> lookup_service.ResolveServiceResponse: """Post-rpc interceptor for resolve_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resolve_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the LookupService server but before - it is returned to user code. + it is returned to user code. This `post_resolve_service` interceptor runs + before the `post_resolve_service_with_metadata` interceptor. """ return response + def post_resolve_service_with_metadata( + self, + response: lookup_service.ResolveServiceResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + lookup_service.ResolveServiceResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for resolve_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the LookupService server but before it is returned to user code. + + We recommend only using this `post_resolve_service_with_metadata` + interceptor in new development instead of the `post_resolve_service` interceptor. + When both interceptors are used, this `post_resolve_service_with_metadata` interceptor runs after the + `post_resolve_service` interceptor. The (possibly modified) response returned by + `post_resolve_service` will be passed to + `post_resolve_service_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -373,6 +398,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resolve_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resolve_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/client.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/client.py index 635524c57e5b..62416ad4591f 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/client.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -582,6 +584,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. @@ -2897,16 +2926,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2952,16 +2985,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/transports/rest.py b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/transports/rest.py index fa074f4446bc..b4525b467cb3 100644 --- a/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/transports/rest.py +++ b/packages/google-cloud-service-directory/google/cloud/servicedirectory_v1beta1/services/registration_service/transports/rest.py @@ -236,12 +236,35 @@ def post_create_endpoint( ) -> gcs_endpoint.Endpoint: """Post-rpc interceptor for create_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_endpoint` interceptor runs + before the `post_create_endpoint_with_metadata` interceptor. """ return response + def post_create_endpoint_with_metadata( + self, + response: gcs_endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_endpoint_with_metadata` + interceptor in new development instead of the `post_create_endpoint` interceptor. + When both interceptors are used, this `post_create_endpoint_with_metadata` interceptor runs after the + `post_create_endpoint` interceptor. The (possibly modified) response returned by + `post_create_endpoint` will be passed to + `post_create_endpoint_with_metadata`. + """ + return response, metadata + def pre_create_namespace( self, request: registration_service.CreateNamespaceRequest, @@ -262,12 +285,35 @@ def post_create_namespace( ) -> gcs_namespace.Namespace: """Post-rpc interceptor for create_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_namespace` interceptor runs + before the `post_create_namespace_with_metadata` interceptor. """ return response + def post_create_namespace_with_metadata( + self, + response: gcs_namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_namespace_with_metadata` + interceptor in new development instead of the `post_create_namespace` interceptor. + When both interceptors are used, this `post_create_namespace_with_metadata` interceptor runs after the + `post_create_namespace` interceptor. The (possibly modified) response returned by + `post_create_namespace` will be passed to + `post_create_namespace_with_metadata`. + """ + return response, metadata + def pre_create_service( self, request: registration_service.CreateServiceRequest, @@ -286,12 +332,35 @@ def pre_create_service( def post_create_service(self, response: gcs_service.Service) -> gcs_service.Service: """Post-rpc interceptor for create_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_create_service` interceptor runs + before the `post_create_service_with_metadata` interceptor. """ return response + def post_create_service_with_metadata( + self, + response: gcs_service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_create_service_with_metadata` + interceptor in new development instead of the `post_create_service` interceptor. + When both interceptors are used, this `post_create_service_with_metadata` interceptor runs after the + `post_create_service` interceptor. The (possibly modified) response returned by + `post_create_service` will be passed to + `post_create_service_with_metadata`. + """ + return response, metadata + def pre_delete_endpoint( self, request: registration_service.DeleteEndpointRequest, @@ -354,12 +423,35 @@ def pre_get_endpoint( def post_get_endpoint(self, response: endpoint.Endpoint) -> endpoint.Endpoint: """Post-rpc interceptor for get_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_endpoint` interceptor runs + before the `post_get_endpoint_with_metadata` interceptor. """ return response + def post_get_endpoint_with_metadata( + self, + response: endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_endpoint_with_metadata` + interceptor in new development instead of the `post_get_endpoint` interceptor. + When both interceptors are used, this `post_get_endpoint_with_metadata` interceptor runs after the + `post_get_endpoint` interceptor. The (possibly modified) response returned by + `post_get_endpoint` will be passed to + `post_get_endpoint_with_metadata`. + """ + return response, metadata + def pre_get_iam_policy( self, request: iam_policy_pb2.GetIamPolicyRequest, @@ -377,12 +469,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService 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_namespace( self, request: registration_service.GetNamespaceRequest, @@ -401,12 +516,35 @@ def pre_get_namespace( def post_get_namespace(self, response: namespace.Namespace) -> namespace.Namespace: """Post-rpc interceptor for get_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_namespace` interceptor runs + before the `post_get_namespace_with_metadata` interceptor. """ return response + def post_get_namespace_with_metadata( + self, + response: namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_namespace_with_metadata` + interceptor in new development instead of the `post_get_namespace` interceptor. + When both interceptors are used, this `post_get_namespace_with_metadata` interceptor runs after the + `post_get_namespace` interceptor. The (possibly modified) response returned by + `post_get_namespace` will be passed to + `post_get_namespace_with_metadata`. + """ + return response, metadata + def pre_get_service( self, request: registration_service.GetServiceRequest, @@ -424,12 +562,35 @@ def pre_get_service( def post_get_service(self, response: service.Service) -> service.Service: """Post-rpc interceptor for get_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_get_service` interceptor runs + before the `post_get_service_with_metadata` interceptor. """ return response + def post_get_service_with_metadata( + self, + response: service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_get_service_with_metadata` + interceptor in new development instead of the `post_get_service` interceptor. + When both interceptors are used, this `post_get_service_with_metadata` interceptor runs after the + `post_get_service` interceptor. The (possibly modified) response returned by + `post_get_service` will be passed to + `post_get_service_with_metadata`. + """ + return response, metadata + def pre_list_endpoints( self, request: registration_service.ListEndpointsRequest, @@ -450,12 +611,38 @@ def post_list_endpoints( ) -> registration_service.ListEndpointsResponse: """Post-rpc interceptor for list_endpoints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_endpoints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_endpoints` interceptor runs + before the `post_list_endpoints_with_metadata` interceptor. """ return response + def post_list_endpoints_with_metadata( + self, + response: registration_service.ListEndpointsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListEndpointsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_endpoints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_endpoints_with_metadata` + interceptor in new development instead of the `post_list_endpoints` interceptor. + When both interceptors are used, this `post_list_endpoints_with_metadata` interceptor runs after the + `post_list_endpoints` interceptor. The (possibly modified) response returned by + `post_list_endpoints` will be passed to + `post_list_endpoints_with_metadata`. + """ + return response, metadata + def pre_list_namespaces( self, request: registration_service.ListNamespacesRequest, @@ -476,12 +663,38 @@ def post_list_namespaces( ) -> registration_service.ListNamespacesResponse: """Post-rpc interceptor for list_namespaces - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_namespaces_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_namespaces` interceptor runs + before the `post_list_namespaces_with_metadata` interceptor. """ return response + def post_list_namespaces_with_metadata( + self, + response: registration_service.ListNamespacesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListNamespacesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_namespaces + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_namespaces_with_metadata` + interceptor in new development instead of the `post_list_namespaces` interceptor. + When both interceptors are used, this `post_list_namespaces_with_metadata` interceptor runs after the + `post_list_namespaces` interceptor. The (possibly modified) response returned by + `post_list_namespaces` will be passed to + `post_list_namespaces_with_metadata`. + """ + return response, metadata + def pre_list_services( self, request: registration_service.ListServicesRequest, @@ -502,12 +715,38 @@ def post_list_services( ) -> registration_service.ListServicesResponse: """Post-rpc interceptor for list_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_list_services` interceptor runs + before the `post_list_services_with_metadata` interceptor. """ return response + def post_list_services_with_metadata( + self, + response: registration_service.ListServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + registration_service.ListServicesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_list_services_with_metadata` + interceptor in new development instead of the `post_list_services` interceptor. + When both interceptors are used, this `post_list_services_with_metadata` interceptor runs after the + `post_list_services` interceptor. The (possibly modified) response returned by + `post_list_services` will be passed to + `post_list_services_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -525,12 +764,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -551,12 +813,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService 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_endpoint( self, request: registration_service.UpdateEndpointRequest, @@ -577,12 +865,35 @@ def post_update_endpoint( ) -> gcs_endpoint.Endpoint: """Post-rpc interceptor for update_endpoint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_endpoint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_endpoint` interceptor runs + before the `post_update_endpoint_with_metadata` interceptor. """ return response + def post_update_endpoint_with_metadata( + self, + response: gcs_endpoint.Endpoint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_endpoint.Endpoint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_endpoint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_endpoint_with_metadata` + interceptor in new development instead of the `post_update_endpoint` interceptor. + When both interceptors are used, this `post_update_endpoint_with_metadata` interceptor runs after the + `post_update_endpoint` interceptor. The (possibly modified) response returned by + `post_update_endpoint` will be passed to + `post_update_endpoint_with_metadata`. + """ + return response, metadata + def pre_update_namespace( self, request: registration_service.UpdateNamespaceRequest, @@ -603,12 +914,35 @@ def post_update_namespace( ) -> gcs_namespace.Namespace: """Post-rpc interceptor for update_namespace - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_namespace_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_namespace` interceptor runs + before the `post_update_namespace_with_metadata` interceptor. """ return response + def post_update_namespace_with_metadata( + self, + response: gcs_namespace.Namespace, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_namespace.Namespace, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_namespace + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_namespace_with_metadata` + interceptor in new development instead of the `post_update_namespace` interceptor. + When both interceptors are used, this `post_update_namespace_with_metadata` interceptor runs after the + `post_update_namespace` interceptor. The (possibly modified) response returned by + `post_update_namespace` will be passed to + `post_update_namespace_with_metadata`. + """ + return response, metadata + def pre_update_service( self, request: registration_service.UpdateServiceRequest, @@ -627,12 +961,35 @@ def pre_update_service( def post_update_service(self, response: gcs_service.Service) -> gcs_service.Service: """Post-rpc interceptor for update_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the RegistrationService server but before - it is returned to user code. + it is returned to user code. This `post_update_service` interceptor runs + before the `post_update_service_with_metadata` interceptor. """ return response + def post_update_service_with_metadata( + self, + response: gcs_service.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_service.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the RegistrationService server but before it is returned to user code. + + We recommend only using this `post_update_service_with_metadata` + interceptor in new development instead of the `post_update_service` interceptor. + When both interceptors are used, this `post_update_service_with_metadata` interceptor runs after the + `post_update_service` interceptor. The (possibly modified) response returned by + `post_update_service` will be passed to + `post_update_service_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -913,6 +1270,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1068,6 +1429,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1220,6 +1585,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1693,6 +2062,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1915,6 +2288,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 @@ -2062,6 +2439,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2211,6 +2592,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2355,6 +2740,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_endpoints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_endpoints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2501,6 +2890,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_namespaces(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_namespaces_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2647,6 +3040,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2871,6 +3268,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 @@ -3022,6 +3423,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 @@ -3173,6 +3578,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_endpoint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_endpoint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3328,6 +3737,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_namespace(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_namespace_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3480,6 +3893,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json index b1a1f9ef8eff..bb916a8e137a 100644 --- a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json +++ b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-directory", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json index 507dd97bc8cb..bbc7749e9905 100644 --- a/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json +++ b/packages/google-cloud-service-directory/samples/generated_samples/snippet_metadata_google.cloud.servicedirectory.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-directory", - "version": "1.13.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_lookup_service.py b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_lookup_service.py index 8fec4ddf8e0e..e61cdd49327e 100644 --- a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_lookup_service.py +++ b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_lookup_service.py @@ -60,6 +60,13 @@ ) from google.cloud.servicedirectory_v1.types import lookup_service, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -314,6 +321,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = LookupServiceClient(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 = LookupServiceClient(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", [ @@ -1670,10 +1720,13 @@ def test_resolve_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LookupServiceRestInterceptor, "post_resolve_service" ) as post, mock.patch.object( + transports.LookupServiceRestInterceptor, "post_resolve_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LookupServiceRestInterceptor, "pre_resolve_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = lookup_service.ResolveServiceRequest.pb( lookup_service.ResolveServiceRequest() ) @@ -1699,6 +1752,10 @@ def test_resolve_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = lookup_service.ResolveServiceResponse() + post_with_metadata.return_value = ( + lookup_service.ResolveServiceResponse(), + metadata, + ) client.resolve_service( request, @@ -1710,6 +1767,7 @@ def test_resolve_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_registration_service.py b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_registration_service.py index 1bfd38a6e12c..548396a25d42 100644 --- a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_registration_service.py +++ b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1/test_registration_service.py @@ -72,6 +72,13 @@ from google.cloud.servicedirectory_v1.types import service from google.cloud.servicedirectory_v1.types import service as gcs_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -345,6 +352,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = RegistrationServiceClient(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 = RegistrationServiceClient(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", [ @@ -12079,10 +12129,14 @@ def test_create_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateNamespaceRequest.pb( registration_service.CreateNamespaceRequest() ) @@ -12106,6 +12160,7 @@ def test_create_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_namespace.Namespace() + post_with_metadata.return_value = gcs_namespace.Namespace(), metadata client.create_namespace( request, @@ -12117,6 +12172,7 @@ def test_create_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_namespaces_rest_bad_request( @@ -12201,10 +12257,14 @@ def test_list_namespaces_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_namespaces" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_namespaces_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_namespaces" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListNamespacesRequest.pb( registration_service.ListNamespacesRequest() ) @@ -12230,6 +12290,10 @@ def test_list_namespaces_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListNamespacesResponse() + post_with_metadata.return_value = ( + registration_service.ListNamespacesResponse(), + metadata, + ) client.list_namespaces( request, @@ -12241,6 +12305,7 @@ def test_list_namespaces_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_namespace_rest_bad_request( @@ -12327,10 +12392,14 @@ def test_get_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_get_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetNamespaceRequest.pb( registration_service.GetNamespaceRequest() ) @@ -12354,6 +12423,7 @@ def test_get_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = namespace.Namespace() + post_with_metadata.return_value = namespace.Namespace(), metadata client.get_namespace( request, @@ -12365,6 +12435,7 @@ def test_get_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_namespace_rest_bad_request( @@ -12527,10 +12598,14 @@ def test_update_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateNamespaceRequest.pb( registration_service.UpdateNamespaceRequest() ) @@ -12554,6 +12629,7 @@ def test_update_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_namespace.Namespace() + post_with_metadata.return_value = gcs_namespace.Namespace(), metadata client.update_namespace( request, @@ -12565,6 +12641,7 @@ def test_update_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_namespace_rest_bad_request( @@ -12842,10 +12919,14 @@ def test_create_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateServiceRequest.pb( registration_service.CreateServiceRequest() ) @@ -12869,6 +12950,7 @@ def test_create_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_service.Service() + post_with_metadata.return_value = gcs_service.Service(), metadata client.create_service( request, @@ -12880,6 +12962,7 @@ def test_create_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_services_rest_bad_request( @@ -12964,10 +13047,14 @@ def test_list_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_services" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_services_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListServicesRequest.pb( registration_service.ListServicesRequest() ) @@ -12993,6 +13080,10 @@ def test_list_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListServicesResponse() + post_with_metadata.return_value = ( + registration_service.ListServicesResponse(), + metadata, + ) client.list_services( request, @@ -13004,6 +13095,7 @@ def test_list_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_service_rest_bad_request( @@ -13094,10 +13186,13 @@ def test_get_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, "post_get_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetServiceRequest.pb( registration_service.GetServiceRequest() ) @@ -13121,6 +13216,7 @@ def test_get_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Service() + post_with_metadata.return_value = service.Service(), metadata client.get_service( request, @@ -13132,6 +13228,7 @@ def test_get_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_service_rest_bad_request( @@ -13308,10 +13405,14 @@ def test_update_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateServiceRequest.pb( registration_service.UpdateServiceRequest() ) @@ -13335,6 +13436,7 @@ def test_update_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_service.Service() + post_with_metadata.return_value = gcs_service.Service(), metadata client.update_service( request, @@ -13346,6 +13448,7 @@ def test_update_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_service_rest_bad_request( @@ -13630,10 +13733,14 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_endpoint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateEndpointRequest.pb( registration_service.CreateEndpointRequest() ) @@ -13657,6 +13764,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_endpoint.Endpoint() + post_with_metadata.return_value = gcs_endpoint.Endpoint(), metadata client.create_endpoint( request, @@ -13668,6 +13776,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_endpoints_rest_bad_request( @@ -13756,10 +13865,14 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_endpoints" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListEndpointsRequest.pb( registration_service.ListEndpointsRequest() ) @@ -13785,6 +13898,10 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListEndpointsResponse() + post_with_metadata.return_value = ( + registration_service.ListEndpointsResponse(), + metadata, + ) client.list_endpoints( request, @@ -13796,6 +13913,7 @@ def test_list_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_endpoint_rest_bad_request( @@ -13892,10 +14010,13 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, "post_get_endpoint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetEndpointRequest.pb( registration_service.GetEndpointRequest() ) @@ -13919,6 +14040,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = endpoint.Endpoint() + post_with_metadata.return_value = endpoint.Endpoint(), metadata client.get_endpoint( request, @@ -13930,6 +14052,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_endpoint_rest_bad_request( @@ -14105,10 +14228,14 @@ def test_update_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_endpoint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateEndpointRequest.pb( registration_service.UpdateEndpointRequest() ) @@ -14132,6 +14259,7 @@ def test_update_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_endpoint.Endpoint() + post_with_metadata.return_value = gcs_endpoint.Endpoint(), metadata client.update_endpoint( request, @@ -14143,6 +14271,7 @@ def test_update_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_endpoint_rest_bad_request( @@ -14339,10 +14468,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14364,6 +14497,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -14375,6 +14509,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -14458,10 +14593,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14483,6 +14622,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -14494,6 +14634,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( @@ -14575,10 +14716,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -14602,6 +14747,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -14613,6 +14762,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_lookup_service.py b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_lookup_service.py index bdd834a45ef6..c5caa1a8a425 100644 --- a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_lookup_service.py +++ b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_lookup_service.py @@ -60,6 +60,13 @@ ) from google.cloud.servicedirectory_v1beta1.types import lookup_service, service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -314,6 +321,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = LookupServiceClient(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 = LookupServiceClient(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", [ @@ -1670,10 +1720,13 @@ def test_resolve_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.LookupServiceRestInterceptor, "post_resolve_service" ) as post, mock.patch.object( + transports.LookupServiceRestInterceptor, "post_resolve_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.LookupServiceRestInterceptor, "pre_resolve_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = lookup_service.ResolveServiceRequest.pb( lookup_service.ResolveServiceRequest() ) @@ -1699,6 +1752,10 @@ def test_resolve_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = lookup_service.ResolveServiceResponse() + post_with_metadata.return_value = ( + lookup_service.ResolveServiceResponse(), + metadata, + ) client.resolve_service( request, @@ -1710,6 +1767,7 @@ def test_resolve_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_registration_service.py b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_registration_service.py index 1f1e3668f7cf..c2e4641db9f4 100644 --- a/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_registration_service.py +++ b/packages/google-cloud-service-directory/tests/unit/gapic/servicedirectory_v1beta1/test_registration_service.py @@ -73,6 +73,13 @@ from google.cloud.servicedirectory_v1beta1.types import service from google.cloud.servicedirectory_v1beta1.types import service as gcs_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -346,6 +353,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = RegistrationServiceClient(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 = RegistrationServiceClient(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", [ @@ -12090,10 +12140,14 @@ def test_create_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateNamespaceRequest.pb( registration_service.CreateNamespaceRequest() ) @@ -12117,6 +12171,7 @@ def test_create_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_namespace.Namespace() + post_with_metadata.return_value = gcs_namespace.Namespace(), metadata client.create_namespace( request, @@ -12128,6 +12183,7 @@ def test_create_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_namespaces_rest_bad_request( @@ -12212,10 +12268,14 @@ def test_list_namespaces_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_namespaces" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_namespaces_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_namespaces" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListNamespacesRequest.pb( registration_service.ListNamespacesRequest() ) @@ -12241,6 +12301,10 @@ def test_list_namespaces_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListNamespacesResponse() + post_with_metadata.return_value = ( + registration_service.ListNamespacesResponse(), + metadata, + ) client.list_namespaces( request, @@ -12252,6 +12316,7 @@ def test_list_namespaces_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_namespace_rest_bad_request( @@ -12338,10 +12403,14 @@ def test_get_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_get_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetNamespaceRequest.pb( registration_service.GetNamespaceRequest() ) @@ -12365,6 +12434,7 @@ def test_get_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = namespace.Namespace() + post_with_metadata.return_value = namespace.Namespace(), metadata client.get_namespace( request, @@ -12376,6 +12446,7 @@ def test_get_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_namespace_rest_bad_request( @@ -12540,10 +12611,14 @@ def test_update_namespace_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_namespace" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_namespace_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_namespace" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateNamespaceRequest.pb( registration_service.UpdateNamespaceRequest() ) @@ -12567,6 +12642,7 @@ def test_update_namespace_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_namespace.Namespace() + post_with_metadata.return_value = gcs_namespace.Namespace(), metadata client.update_namespace( request, @@ -12578,6 +12654,7 @@ def test_update_namespace_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_namespace_rest_bad_request( @@ -12859,10 +12936,14 @@ def test_create_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateServiceRequest.pb( registration_service.CreateServiceRequest() ) @@ -12886,6 +12967,7 @@ def test_create_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_service.Service() + post_with_metadata.return_value = gcs_service.Service(), metadata client.create_service( request, @@ -12897,6 +12979,7 @@ def test_create_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_services_rest_bad_request( @@ -12981,10 +13064,14 @@ def test_list_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_services" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_services_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListServicesRequest.pb( registration_service.ListServicesRequest() ) @@ -13010,6 +13097,10 @@ def test_list_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListServicesResponse() + post_with_metadata.return_value = ( + registration_service.ListServicesResponse(), + metadata, + ) client.list_services( request, @@ -13021,6 +13112,7 @@ def test_list_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_service_rest_bad_request( @@ -13111,10 +13203,13 @@ def test_get_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, "post_get_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetServiceRequest.pb( registration_service.GetServiceRequest() ) @@ -13138,6 +13233,7 @@ def test_get_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = service.Service() + post_with_metadata.return_value = service.Service(), metadata client.get_service( request, @@ -13149,6 +13245,7 @@ def test_get_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_service_rest_bad_request( @@ -13329,10 +13426,14 @@ def test_update_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_service" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_service_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateServiceRequest.pb( registration_service.UpdateServiceRequest() ) @@ -13356,6 +13457,7 @@ def test_update_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_service.Service() + post_with_metadata.return_value = gcs_service.Service(), metadata client.update_service( request, @@ -13367,6 +13469,7 @@ def test_update_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_service_rest_bad_request( @@ -13653,10 +13756,14 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_create_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_create_endpoint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_create_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.CreateEndpointRequest.pb( registration_service.CreateEndpointRequest() ) @@ -13680,6 +13787,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_endpoint.Endpoint() + post_with_metadata.return_value = gcs_endpoint.Endpoint(), metadata client.create_endpoint( request, @@ -13691,6 +13799,7 @@ def test_create_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_endpoints_rest_bad_request( @@ -13779,10 +13888,14 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_list_endpoints" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_list_endpoints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_list_endpoints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.ListEndpointsRequest.pb( registration_service.ListEndpointsRequest() ) @@ -13808,6 +13921,10 @@ def test_list_endpoints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = registration_service.ListEndpointsResponse() + post_with_metadata.return_value = ( + registration_service.ListEndpointsResponse(), + metadata, + ) client.list_endpoints( request, @@ -13819,6 +13936,7 @@ def test_list_endpoints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_endpoint_rest_bad_request( @@ -13915,10 +14033,13 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, "post_get_endpoint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.GetEndpointRequest.pb( registration_service.GetEndpointRequest() ) @@ -13942,6 +14063,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = endpoint.Endpoint() + post_with_metadata.return_value = endpoint.Endpoint(), metadata client.get_endpoint( request, @@ -13953,6 +14075,7 @@ def test_get_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_endpoint_rest_bad_request( @@ -14130,10 +14253,14 @@ def test_update_endpoint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_update_endpoint" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_update_endpoint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_update_endpoint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = registration_service.UpdateEndpointRequest.pb( registration_service.UpdateEndpointRequest() ) @@ -14157,6 +14284,7 @@ def test_update_endpoint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_endpoint.Endpoint() + post_with_metadata.return_value = gcs_endpoint.Endpoint(), metadata client.update_endpoint( request, @@ -14168,6 +14296,7 @@ def test_update_endpoint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_endpoint_rest_bad_request( @@ -14364,10 +14493,14 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_get_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14389,6 +14522,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -14400,6 +14534,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -14483,10 +14618,14 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_set_iam_policy_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14508,6 +14647,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -14519,6 +14659,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( @@ -14600,10 +14741,14 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.RegistrationServiceRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.RegistrationServiceRestInterceptor, + "post_test_iam_permissions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.RegistrationServiceRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -14627,6 +14772,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -14638,6 +14787,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-service-usage/google/cloud/service_usage/gapic_version.py b/packages/google-cloud-service-usage/google/cloud/service_usage/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-service-usage/google/cloud/service_usage/gapic_version.py +++ b/packages/google-cloud-service-usage/google/cloud/service_usage/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/gapic_version.py b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/gapic_version.py index 739fdfae141c..558c8aab67c5 100644 --- a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/gapic_version.py +++ b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.12.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/client.py b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/client.py index c6f5f25d2a96..f55f684d0553 100644 --- a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/client.py +++ b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -487,6 +489,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1315,16 +1344,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1370,16 +1403,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/transports/rest.py b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/transports/rest.py index b34d14403909..e31df65c1adf 100644 --- a/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/transports/rest.py +++ b/packages/google-cloud-service-usage/google/cloud/service_usage_v1/services/service_usage/transports/rest.py @@ -142,12 +142,35 @@ def post_batch_enable_services( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_enable_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_enable_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_batch_enable_services` interceptor runs + before the `post_batch_enable_services_with_metadata` interceptor. """ return response + def post_batch_enable_services_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_enable_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_batch_enable_services_with_metadata` + interceptor in new development instead of the `post_batch_enable_services` interceptor. + When both interceptors are used, this `post_batch_enable_services_with_metadata` interceptor runs after the + `post_batch_enable_services` interceptor. The (possibly modified) response returned by + `post_batch_enable_services` will be passed to + `post_batch_enable_services_with_metadata`. + """ + return response, metadata + def pre_batch_get_services( self, request: serviceusage.BatchGetServicesRequest, @@ -167,12 +190,37 @@ def post_batch_get_services( ) -> serviceusage.BatchGetServicesResponse: """Post-rpc interceptor for batch_get_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_get_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_batch_get_services` interceptor runs + before the `post_batch_get_services_with_metadata` interceptor. """ return response + def post_batch_get_services_with_metadata( + self, + response: serviceusage.BatchGetServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + serviceusage.BatchGetServicesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for batch_get_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_batch_get_services_with_metadata` + interceptor in new development instead of the `post_batch_get_services` interceptor. + When both interceptors are used, this `post_batch_get_services_with_metadata` interceptor runs after the + `post_batch_get_services` interceptor. The (possibly modified) response returned by + `post_batch_get_services` will be passed to + `post_batch_get_services_with_metadata`. + """ + return response, metadata + def pre_disable_service( self, request: serviceusage.DisableServiceRequest, @@ -192,12 +240,35 @@ def post_disable_service( ) -> operations_pb2.Operation: """Post-rpc interceptor for disable_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_disable_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_disable_service` interceptor runs + before the `post_disable_service_with_metadata` interceptor. """ return response + def post_disable_service_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for disable_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_disable_service_with_metadata` + interceptor in new development instead of the `post_disable_service` interceptor. + When both interceptors are used, this `post_disable_service_with_metadata` interceptor runs after the + `post_disable_service` interceptor. The (possibly modified) response returned by + `post_disable_service` will be passed to + `post_disable_service_with_metadata`. + """ + return response, metadata + def pre_enable_service( self, request: serviceusage.EnableServiceRequest, @@ -217,12 +288,35 @@ def post_enable_service( ) -> operations_pb2.Operation: """Post-rpc interceptor for enable_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_enable_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_enable_service` interceptor runs + before the `post_enable_service_with_metadata` interceptor. """ return response + def post_enable_service_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for enable_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_enable_service_with_metadata` + interceptor in new development instead of the `post_enable_service` interceptor. + When both interceptors are used, this `post_enable_service_with_metadata` interceptor runs after the + `post_enable_service` interceptor. The (possibly modified) response returned by + `post_enable_service` will be passed to + `post_enable_service_with_metadata`. + """ + return response, metadata + def pre_get_service( self, request: serviceusage.GetServiceRequest, @@ -238,12 +332,35 @@ def pre_get_service( def post_get_service(self, response: resources.Service) -> resources.Service: """Post-rpc interceptor for get_service - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_service_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_get_service` interceptor runs + before the `post_get_service_with_metadata` interceptor. """ return response + def post_get_service_with_metadata( + self, + response: resources.Service, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resources.Service, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_service + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_get_service_with_metadata` + interceptor in new development instead of the `post_get_service` interceptor. + When both interceptors are used, this `post_get_service_with_metadata` interceptor runs after the + `post_get_service` interceptor. The (possibly modified) response returned by + `post_get_service` will be passed to + `post_get_service_with_metadata`. + """ + return response, metadata + def pre_list_services( self, request: serviceusage.ListServicesRequest, @@ -263,12 +380,37 @@ def post_list_services( ) -> serviceusage.ListServicesResponse: """Post-rpc interceptor for list_services - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_services_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceUsage server but before - it is returned to user code. + it is returned to user code. This `post_list_services` interceptor runs + before the `post_list_services_with_metadata` interceptor. """ return response + def post_list_services_with_metadata( + self, + response: serviceusage.ListServicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + serviceusage.ListServicesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_services + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceUsage server but before it is returned to user code. + + We recommend only using this `post_list_services_with_metadata` + interceptor in new development instead of the `post_list_services` interceptor. + When both interceptors are used, this `post_list_services_with_metadata` interceptor runs after the + `post_list_services` interceptor. The (possibly modified) response returned by + `post_list_services` will be passed to + `post_list_services_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -578,6 +720,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_enable_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_enable_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -720,6 +866,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_get_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_get_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -869,6 +1019,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_disable_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_disable_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1016,6 +1170,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_enable_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_enable_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1162,6 +1320,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_service(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_service_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1304,6 +1466,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_services(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_services_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-service-usage/samples/generated_samples/snippet_metadata_google.api.serviceusage.v1.json b/packages/google-cloud-service-usage/samples/generated_samples/snippet_metadata_google.api.serviceusage.v1.json index 157b2e480a5a..7c0c44f2ca72 100644 --- a/packages/google-cloud-service-usage/samples/generated_samples/snippet_metadata_google.api.serviceusage.v1.json +++ b/packages/google-cloud-service-usage/samples/generated_samples/snippet_metadata_google.api.serviceusage.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-service-usage", - "version": "1.12.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-service-usage/tests/unit/gapic/service_usage_v1/test_service_usage.py b/packages/google-cloud-service-usage/tests/unit/gapic/service_usage_v1/test_service_usage.py index c4404635d277..142ef8c3e513 100644 --- a/packages/google-cloud-service-usage/tests/unit/gapic/service_usage_v1/test_service_usage.py +++ b/packages/google-cloud-service-usage/tests/unit/gapic/service_usage_v1/test_service_usage.py @@ -70,6 +70,13 @@ ) from google.cloud.service_usage_v1.types import resources, serviceusage +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 = ServiceUsageClient(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 = ServiceUsageClient(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", [ @@ -3530,10 +3580,13 @@ def test_enable_service_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ServiceUsageRestInterceptor, "post_enable_service" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, "post_enable_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_enable_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.EnableServiceRequest.pb( serviceusage.EnableServiceRequest() ) @@ -3557,6 +3610,7 @@ def test_enable_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.enable_service( request, @@ -3568,6 +3622,7 @@ def test_enable_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_disable_service_rest_bad_request( @@ -3648,10 +3703,13 @@ def test_disable_service_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ServiceUsageRestInterceptor, "post_disable_service" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, "post_disable_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_disable_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.DisableServiceRequest.pb( serviceusage.DisableServiceRequest() ) @@ -3675,6 +3733,7 @@ def test_disable_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.disable_service( request, @@ -3686,6 +3745,7 @@ def test_disable_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_service_rest_bad_request(request_type=serviceusage.GetServiceRequest): @@ -3772,10 +3832,13 @@ def test_get_service_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceUsageRestInterceptor, "post_get_service" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, "post_get_service_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_get_service" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.GetServiceRequest.pb(serviceusage.GetServiceRequest()) transcode.return_value = { "method": "post", @@ -3797,6 +3860,7 @@ def test_get_service_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resources.Service() + post_with_metadata.return_value = resources.Service(), metadata client.get_service( request, @@ -3808,6 +3872,7 @@ def test_get_service_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_services_rest_bad_request(request_type=serviceusage.ListServicesRequest): @@ -3890,10 +3955,13 @@ def test_list_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceUsageRestInterceptor, "post_list_services" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, "post_list_services_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_list_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.ListServicesRequest.pb( serviceusage.ListServicesRequest() ) @@ -3919,6 +3987,7 @@ def test_list_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = serviceusage.ListServicesResponse() + post_with_metadata.return_value = serviceusage.ListServicesResponse(), metadata client.list_services( request, @@ -3930,6 +3999,7 @@ def test_list_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_enable_services_rest_bad_request( @@ -4010,10 +4080,14 @@ def test_batch_enable_services_rest_interceptors(null_interceptor): ), mock.patch.object( transports.ServiceUsageRestInterceptor, "post_batch_enable_services" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, + "post_batch_enable_services_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_batch_enable_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.BatchEnableServicesRequest.pb( serviceusage.BatchEnableServicesRequest() ) @@ -4037,6 +4111,7 @@ def test_batch_enable_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_enable_services( request, @@ -4048,6 +4123,7 @@ def test_batch_enable_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_get_services_rest_bad_request( @@ -4129,10 +4205,13 @@ def test_batch_get_services_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceUsageRestInterceptor, "post_batch_get_services" ) as post, mock.patch.object( + transports.ServiceUsageRestInterceptor, "post_batch_get_services_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceUsageRestInterceptor, "pre_batch_get_services" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = serviceusage.BatchGetServicesRequest.pb( serviceusage.BatchGetServicesRequest() ) @@ -4158,6 +4237,10 @@ def test_batch_get_services_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = serviceusage.BatchGetServicesResponse() + post_with_metadata.return_value = ( + serviceusage.BatchGetServicesResponse(), + metadata, + ) client.batch_get_services( request, @@ -4169,6 +4252,7 @@ def test_batch_get_services_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-servicehealth/google/cloud/servicehealth/gapic_version.py b/packages/google-cloud-servicehealth/google/cloud/servicehealth/gapic_version.py index 9413c3341313..558c8aab67c5 100644 --- a/packages/google-cloud-servicehealth/google/cloud/servicehealth/gapic_version.py +++ b/packages/google-cloud-servicehealth/google/cloud/servicehealth/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.10" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/gapic_version.py b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/gapic_version.py index 9413c3341313..558c8aab67c5 100644 --- a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/gapic_version.py +++ b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.10" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/client.py b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/client.py index 1fd9a38bc086..b5822752ba1d 100644 --- a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/client.py +++ b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/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 @@ -531,6 +533,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. @@ -1525,16 +1554,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1580,16 +1613,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/transports/rest.py b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/transports/rest.py index 76d39b4fb563..d95d3dd01668 100644 --- a/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/transports/rest.py +++ b/packages/google-cloud-servicehealth/google/cloud/servicehealth_v1/services/service_health/transports/rest.py @@ -140,12 +140,35 @@ def pre_get_event( def post_get_event(self, response: event_resources.Event) -> event_resources.Event: """Post-rpc interceptor for get_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_get_event` interceptor runs + before the `post_get_event_with_metadata` interceptor. """ return response + def post_get_event_with_metadata( + self, + response: event_resources.Event, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[event_resources.Event, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_get_event_with_metadata` + interceptor in new development instead of the `post_get_event` interceptor. + When both interceptors are used, this `post_get_event_with_metadata` interceptor runs after the + `post_get_event` interceptor. The (possibly modified) response returned by + `post_get_event` will be passed to + `post_get_event_with_metadata`. + """ + return response, metadata + def pre_get_organization_event( self, request: event_resources.GetOrganizationEventRequest, @@ -166,12 +189,37 @@ def post_get_organization_event( ) -> event_resources.OrganizationEvent: """Post-rpc interceptor for get_organization_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_get_organization_event` interceptor runs + before the `post_get_organization_event_with_metadata` interceptor. """ return response + def post_get_organization_event_with_metadata( + self, + response: event_resources.OrganizationEvent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_resources.OrganizationEvent, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_organization_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_get_organization_event_with_metadata` + interceptor in new development instead of the `post_get_organization_event` interceptor. + When both interceptors are used, this `post_get_organization_event_with_metadata` interceptor runs after the + `post_get_organization_event` interceptor. The (possibly modified) response returned by + `post_get_organization_event` will be passed to + `post_get_organization_event_with_metadata`. + """ + return response, metadata + def pre_get_organization_impact( self, request: event_resources.GetOrganizationImpactRequest, @@ -192,12 +240,37 @@ def post_get_organization_impact( ) -> event_resources.OrganizationImpact: """Post-rpc interceptor for get_organization_impact - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_organization_impact_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_get_organization_impact` interceptor runs + before the `post_get_organization_impact_with_metadata` interceptor. """ return response + def post_get_organization_impact_with_metadata( + self, + response: event_resources.OrganizationImpact, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_resources.OrganizationImpact, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_organization_impact + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_get_organization_impact_with_metadata` + interceptor in new development instead of the `post_get_organization_impact` interceptor. + When both interceptors are used, this `post_get_organization_impact_with_metadata` interceptor runs after the + `post_get_organization_impact` interceptor. The (possibly modified) response returned by + `post_get_organization_impact` will be passed to + `post_get_organization_impact_with_metadata`. + """ + return response, metadata + def pre_list_events( self, request: event_resources.ListEventsRequest, @@ -217,12 +290,37 @@ def post_list_events( ) -> event_resources.ListEventsResponse: """Post-rpc interceptor for list_events - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_events_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_list_events` interceptor runs + before the `post_list_events_with_metadata` interceptor. """ return response + def post_list_events_with_metadata( + self, + response: event_resources.ListEventsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_resources.ListEventsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_events + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_list_events_with_metadata` + interceptor in new development instead of the `post_list_events` interceptor. + When both interceptors are used, this `post_list_events_with_metadata` interceptor runs after the + `post_list_events` interceptor. The (possibly modified) response returned by + `post_list_events` will be passed to + `post_list_events_with_metadata`. + """ + return response, metadata + def pre_list_organization_events( self, request: event_resources.ListOrganizationEventsRequest, @@ -243,12 +341,38 @@ def post_list_organization_events( ) -> event_resources.ListOrganizationEventsResponse: """Post-rpc interceptor for list_organization_events - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_organization_events_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_list_organization_events` interceptor runs + before the `post_list_organization_events_with_metadata` interceptor. """ return response + def post_list_organization_events_with_metadata( + self, + response: event_resources.ListOrganizationEventsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_resources.ListOrganizationEventsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_organization_events + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_list_organization_events_with_metadata` + interceptor in new development instead of the `post_list_organization_events` interceptor. + When both interceptors are used, this `post_list_organization_events_with_metadata` interceptor runs after the + `post_list_organization_events` interceptor. The (possibly modified) response returned by + `post_list_organization_events` will be passed to + `post_list_organization_events_with_metadata`. + """ + return response, metadata + def pre_list_organization_impacts( self, request: event_resources.ListOrganizationImpactsRequest, @@ -269,12 +393,38 @@ def post_list_organization_impacts( ) -> event_resources.ListOrganizationImpactsResponse: """Post-rpc interceptor for list_organization_impacts - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_organization_impacts_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the ServiceHealth server but before - it is returned to user code. + it is returned to user code. This `post_list_organization_impacts` interceptor runs + before the `post_list_organization_impacts_with_metadata` interceptor. """ return response + def post_list_organization_impacts_with_metadata( + self, + response: event_resources.ListOrganizationImpactsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + event_resources.ListOrganizationImpactsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_organization_impacts + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the ServiceHealth server but before it is returned to user code. + + We recommend only using this `post_list_organization_impacts_with_metadata` + interceptor in new development instead of the `post_list_organization_impacts` interceptor. + When both interceptors are used, this `post_list_organization_impacts_with_metadata` interceptor runs after the + `post_list_organization_impacts` interceptor. The (possibly modified) response returned by + `post_list_organization_impacts` will be passed to + `post_list_organization_impacts_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -540,6 +690,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -688,6 +842,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -838,6 +996,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_organization_impact(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_organization_impact_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -986,6 +1148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_events(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_events_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1134,6 +1300,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_organization_events(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_organization_events_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1285,6 +1455,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_organization_impacts(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_organization_impacts_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-servicehealth/samples/generated_samples/snippet_metadata_google.cloud.servicehealth.v1.json b/packages/google-cloud-servicehealth/samples/generated_samples/snippet_metadata_google.cloud.servicehealth.v1.json index 238ba9a839f8..8ec1ea7b2c3b 100644 --- a/packages/google-cloud-servicehealth/samples/generated_samples/snippet_metadata_google.cloud.servicehealth.v1.json +++ b/packages/google-cloud-servicehealth/samples/generated_samples/snippet_metadata_google.cloud.servicehealth.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-servicehealth", - "version": "0.1.10" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-servicehealth/tests/unit/gapic/servicehealth_v1/test_service_health.py b/packages/google-cloud-servicehealth/tests/unit/gapic/servicehealth_v1/test_service_health.py index 7fe6d1436862..bf641a1a27f2 100644 --- a/packages/google-cloud-servicehealth/tests/unit/gapic/servicehealth_v1/test_service_health.py +++ b/packages/google-cloud-servicehealth/tests/unit/gapic/servicehealth_v1/test_service_health.py @@ -62,6 +62,13 @@ ) from google.cloud.servicehealth_v1.types import event_resources +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -316,6 +323,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = ServiceHealthClient(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 = ServiceHealthClient(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", [ @@ -5650,10 +5700,13 @@ def test_list_events_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_list_events" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, "post_list_events_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_list_events" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.ListEventsRequest.pb( event_resources.ListEventsRequest() ) @@ -5679,6 +5732,7 @@ def test_list_events_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.ListEventsResponse() + post_with_metadata.return_value = event_resources.ListEventsResponse(), metadata client.list_events( request, @@ -5690,6 +5744,7 @@ def test_list_events_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_event_rest_bad_request(request_type=event_resources.GetEventRequest): @@ -5791,10 +5846,13 @@ def test_get_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_get_event" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, "post_get_event_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_get_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.GetEventRequest.pb( event_resources.GetEventRequest() ) @@ -5818,6 +5876,7 @@ def test_get_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.Event() + post_with_metadata.return_value = event_resources.Event(), metadata client.get_event( request, @@ -5829,6 +5888,7 @@ def test_get_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_organization_events_rest_bad_request( @@ -5915,10 +5975,14 @@ def test_list_organization_events_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_list_organization_events" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, + "post_list_organization_events_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_list_organization_events" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.ListOrganizationEventsRequest.pb( event_resources.ListOrganizationEventsRequest() ) @@ -5944,6 +6008,10 @@ def test_list_organization_events_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.ListOrganizationEventsResponse() + post_with_metadata.return_value = ( + event_resources.ListOrganizationEventsResponse(), + metadata, + ) client.list_organization_events( request, @@ -5955,6 +6023,7 @@ def test_list_organization_events_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_organization_event_rest_bad_request( @@ -6063,10 +6132,14 @@ def test_get_organization_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_get_organization_event" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, + "post_get_organization_event_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_get_organization_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.GetOrganizationEventRequest.pb( event_resources.GetOrganizationEventRequest() ) @@ -6092,6 +6165,7 @@ def test_get_organization_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.OrganizationEvent() + post_with_metadata.return_value = event_resources.OrganizationEvent(), metadata client.get_organization_event( request, @@ -6103,6 +6177,7 @@ def test_get_organization_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_organization_impacts_rest_bad_request( @@ -6189,10 +6264,14 @@ def test_list_organization_impacts_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_list_organization_impacts" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, + "post_list_organization_impacts_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_list_organization_impacts" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.ListOrganizationImpactsRequest.pb( event_resources.ListOrganizationImpactsRequest() ) @@ -6218,6 +6297,10 @@ def test_list_organization_impacts_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.ListOrganizationImpactsResponse() + post_with_metadata.return_value = ( + event_resources.ListOrganizationImpactsResponse(), + metadata, + ) client.list_organization_impacts( request, @@ -6229,6 +6312,7 @@ def test_list_organization_impacts_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_organization_impact_rest_bad_request( @@ -6319,10 +6403,14 @@ def test_get_organization_impact_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.ServiceHealthRestInterceptor, "post_get_organization_impact" ) as post, mock.patch.object( + transports.ServiceHealthRestInterceptor, + "post_get_organization_impact_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.ServiceHealthRestInterceptor, "pre_get_organization_impact" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_resources.GetOrganizationImpactRequest.pb( event_resources.GetOrganizationImpactRequest() ) @@ -6348,6 +6436,7 @@ def test_get_organization_impact_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event_resources.OrganizationImpact() + post_with_metadata.return_value = event_resources.OrganizationImpact(), metadata client.get_organization_impact( request, @@ -6359,6 +6448,7 @@ def test_get_organization_impact_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-shell/google/cloud/shell/gapic_version.py b/packages/google-cloud-shell/google/cloud/shell/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-shell/google/cloud/shell/gapic_version.py +++ b/packages/google-cloud-shell/google/cloud/shell/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-shell/google/cloud/shell_v1/gapic_version.py b/packages/google-cloud-shell/google/cloud/shell_v1/gapic_version.py index 50d842f376d0..558c8aab67c5 100644 --- a/packages/google-cloud-shell/google/cloud/shell_v1/gapic_version.py +++ b/packages/google-cloud-shell/google/cloud/shell_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.11.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/client.py b/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/client.py index a7231277e4a6..e03281bab01c 100644 --- a/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/client.py +++ b/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -490,6 +492,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-shell/google/cloud/shell_v1/services/cloud_shell_service/transports/rest.py b/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/transports/rest.py index 022b79a4030a..ed85edaf8007 100644 --- a/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/transports/rest.py +++ b/packages/google-cloud-shell/google/cloud/shell_v1/services/cloud_shell_service/transports/rest.py @@ -132,12 +132,35 @@ def post_add_public_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for add_public_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_add_public_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudShellService server but before - it is returned to user code. + it is returned to user code. This `post_add_public_key` interceptor runs + before the `post_add_public_key_with_metadata` interceptor. """ return response + def post_add_public_key_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for add_public_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudShellService server but before it is returned to user code. + + We recommend only using this `post_add_public_key_with_metadata` + interceptor in new development instead of the `post_add_public_key` interceptor. + When both interceptors are used, this `post_add_public_key_with_metadata` interceptor runs after the + `post_add_public_key` interceptor. The (possibly modified) response returned by + `post_add_public_key` will be passed to + `post_add_public_key_with_metadata`. + """ + return response, metadata + def pre_authorize_environment( self, request: cloudshell.AuthorizeEnvironmentRequest, @@ -157,12 +180,35 @@ def post_authorize_environment( ) -> operations_pb2.Operation: """Post-rpc interceptor for authorize_environment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_authorize_environment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudShellService server but before - it is returned to user code. + it is returned to user code. This `post_authorize_environment` interceptor runs + before the `post_authorize_environment_with_metadata` interceptor. """ return response + def post_authorize_environment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for authorize_environment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudShellService server but before it is returned to user code. + + We recommend only using this `post_authorize_environment_with_metadata` + interceptor in new development instead of the `post_authorize_environment` interceptor. + When both interceptors are used, this `post_authorize_environment_with_metadata` interceptor runs after the + `post_authorize_environment` interceptor. The (possibly modified) response returned by + `post_authorize_environment` will be passed to + `post_authorize_environment_with_metadata`. + """ + return response, metadata + def pre_get_environment( self, request: cloudshell.GetEnvironmentRequest, @@ -182,12 +228,35 @@ def post_get_environment( ) -> cloudshell.Environment: """Post-rpc interceptor for get_environment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_environment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudShellService server but before - it is returned to user code. + it is returned to user code. This `post_get_environment` interceptor runs + before the `post_get_environment_with_metadata` interceptor. """ return response + def post_get_environment_with_metadata( + self, + response: cloudshell.Environment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudshell.Environment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_environment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudShellService server but before it is returned to user code. + + We recommend only using this `post_get_environment_with_metadata` + interceptor in new development instead of the `post_get_environment` interceptor. + When both interceptors are used, this `post_get_environment_with_metadata` interceptor runs after the + `post_get_environment` interceptor. The (possibly modified) response returned by + `post_get_environment` will be passed to + `post_get_environment_with_metadata`. + """ + return response, metadata + def pre_remove_public_key( self, request: cloudshell.RemovePublicKeyRequest, @@ -207,12 +276,35 @@ def post_remove_public_key( ) -> operations_pb2.Operation: """Post-rpc interceptor for remove_public_key - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_remove_public_key_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudShellService server but before - it is returned to user code. + it is returned to user code. This `post_remove_public_key` interceptor runs + before the `post_remove_public_key_with_metadata` interceptor. """ return response + def post_remove_public_key_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for remove_public_key + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudShellService server but before it is returned to user code. + + We recommend only using this `post_remove_public_key_with_metadata` + interceptor in new development instead of the `post_remove_public_key` interceptor. + When both interceptors are used, this `post_remove_public_key_with_metadata` interceptor runs after the + `post_remove_public_key` interceptor. The (possibly modified) response returned by + `post_remove_public_key` will be passed to + `post_remove_public_key_with_metadata`. + """ + return response, metadata + def pre_start_environment( self, request: cloudshell.StartEnvironmentRequest, @@ -232,12 +324,35 @@ def post_start_environment( ) -> operations_pb2.Operation: """Post-rpc interceptor for start_environment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_environment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudShellService server but before - it is returned to user code. + it is returned to user code. This `post_start_environment` interceptor runs + before the `post_start_environment_with_metadata` interceptor. """ return response + def post_start_environment_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_environment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudShellService server but before it is returned to user code. + + We recommend only using this `post_start_environment_with_metadata` + interceptor in new development instead of the `post_start_environment` interceptor. + When both interceptors are used, this `post_start_environment_with_metadata` interceptor runs after the + `post_start_environment` interceptor. The (possibly modified) response returned by + `post_start_environment` will be passed to + `post_start_environment_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CloudShellServiceRestStub: @@ -485,6 +600,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_add_public_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_add_public_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -638,6 +757,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_authorize_environment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_authorize_environment_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_get_environment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_environment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -939,6 +1066,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_remove_public_key(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_remove_public_key_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1090,6 +1221,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_environment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_environment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-shell/samples/generated_samples/snippet_metadata_google.cloud.shell.v1.json b/packages/google-cloud-shell/samples/generated_samples/snippet_metadata_google.cloud.shell.v1.json index 57074abcefbe..e58b3321f1fb 100644 --- a/packages/google-cloud-shell/samples/generated_samples/snippet_metadata_google.cloud.shell.v1.json +++ b/packages/google-cloud-shell/samples/generated_samples/snippet_metadata_google.cloud.shell.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-shell", - "version": "1.11.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-shell/tests/unit/gapic/shell_v1/test_cloud_shell_service.py b/packages/google-cloud-shell/tests/unit/gapic/shell_v1/test_cloud_shell_service.py index aafb460afeac..0407dc5a4171 100644 --- a/packages/google-cloud-shell/tests/unit/gapic/shell_v1/test_cloud_shell_service.py +++ b/packages/google-cloud-shell/tests/unit/gapic/shell_v1/test_cloud_shell_service.py @@ -70,6 +70,13 @@ ) from google.cloud.shell_v1.types import cloudshell +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 = CloudShellServiceClient(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 = CloudShellServiceClient(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", [ @@ -3314,10 +3364,14 @@ def test_get_environment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudShellServiceRestInterceptor, "post_get_environment" ) as post, mock.patch.object( + transports.CloudShellServiceRestInterceptor, + "post_get_environment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudShellServiceRestInterceptor, "pre_get_environment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudshell.GetEnvironmentRequest.pb( cloudshell.GetEnvironmentRequest() ) @@ -3341,6 +3395,7 @@ def test_get_environment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudshell.Environment() + post_with_metadata.return_value = cloudshell.Environment(), metadata client.get_environment( request, @@ -3352,6 +3407,7 @@ def test_get_environment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_environment_rest_bad_request( @@ -3432,10 +3488,14 @@ def test_start_environment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudShellServiceRestInterceptor, "post_start_environment" ) as post, mock.patch.object( + transports.CloudShellServiceRestInterceptor, + "post_start_environment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudShellServiceRestInterceptor, "pre_start_environment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudshell.StartEnvironmentRequest.pb( cloudshell.StartEnvironmentRequest() ) @@ -3459,6 +3519,7 @@ def test_start_environment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.start_environment( request, @@ -3470,6 +3531,7 @@ def test_start_environment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_authorize_environment_rest_bad_request( @@ -3550,10 +3612,14 @@ def test_authorize_environment_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudShellServiceRestInterceptor, "post_authorize_environment" ) as post, mock.patch.object( + transports.CloudShellServiceRestInterceptor, + "post_authorize_environment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudShellServiceRestInterceptor, "pre_authorize_environment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudshell.AuthorizeEnvironmentRequest.pb( cloudshell.AuthorizeEnvironmentRequest() ) @@ -3577,6 +3643,7 @@ def test_authorize_environment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.authorize_environment( request, @@ -3588,6 +3655,7 @@ def test_authorize_environment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_add_public_key_rest_bad_request(request_type=cloudshell.AddPublicKeyRequest): @@ -3666,10 +3734,13 @@ def test_add_public_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudShellServiceRestInterceptor, "post_add_public_key" ) as post, mock.patch.object( + transports.CloudShellServiceRestInterceptor, "post_add_public_key_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudShellServiceRestInterceptor, "pre_add_public_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudshell.AddPublicKeyRequest.pb(cloudshell.AddPublicKeyRequest()) transcode.return_value = { "method": "post", @@ -3691,6 +3762,7 @@ def test_add_public_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.add_public_key( request, @@ -3702,6 +3774,7 @@ def test_add_public_key_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_public_key_rest_bad_request( @@ -3782,10 +3855,14 @@ def test_remove_public_key_rest_interceptors(null_interceptor): ), mock.patch.object( transports.CloudShellServiceRestInterceptor, "post_remove_public_key" ) as post, mock.patch.object( + transports.CloudShellServiceRestInterceptor, + "post_remove_public_key_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CloudShellServiceRestInterceptor, "pre_remove_public_key" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudshell.RemovePublicKeyRequest.pb( cloudshell.RemovePublicKeyRequest() ) @@ -3809,6 +3886,7 @@ def test_remove_public_key_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.remove_public_key( request, @@ -3820,6 +3898,7 @@ def test_remove_public_key_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-source-context/google/cloud/source_context/gapic_version.py b/packages/google-cloud-source-context/google/cloud/source_context/gapic_version.py index 186dbb3596a5..558c8aab67c5 100644 --- a/packages/google-cloud-source-context/google/cloud/source_context/gapic_version.py +++ b/packages/google-cloud-source-context/google/cloud/source_context/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.6.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-source-context/google/cloud/source_context_v1/gapic_version.py b/packages/google-cloud-source-context/google/cloud/source_context_v1/gapic_version.py index 186dbb3596a5..558c8aab67c5 100644 --- a/packages/google-cloud-source-context/google/cloud/source_context_v1/gapic_version.py +++ b/packages/google-cloud-source-context/google/cloud/source_context_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.6.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-speech/google/cloud/speech/gapic_version.py b/packages/google-cloud-speech/google/cloud/speech/gapic_version.py index 2ddd49ed275f..558c8aab67c5 100644 --- a/packages/google-cloud-speech/google/cloud/speech/gapic_version.py +++ b/packages/google-cloud-speech/google/cloud/speech/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.30.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-speech/google/cloud/speech_v1/gapic_version.py b/packages/google-cloud-speech/google/cloud/speech_v1/gapic_version.py index 2ddd49ed275f..558c8aab67c5 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1/gapic_version.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.30.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/client.py b/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/client.py index 17e211aa853c..ed38111db15a 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/client.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/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 @@ -507,6 +509,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. @@ -2011,16 +2040,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2066,16 +2099,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/transports/rest.py b/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/transports/rest.py index d3a80f8116b5..d67167d9766e 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/transports/rest.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1/services/adaptation/transports/rest.py @@ -168,12 +168,35 @@ def post_create_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for create_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_create_custom_class` interceptor runs + before the `post_create_custom_class_with_metadata` interceptor. """ return response + def post_create_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_create_custom_class_with_metadata` + interceptor in new development instead of the `post_create_custom_class` interceptor. + When both interceptors are used, this `post_create_custom_class_with_metadata` interceptor runs after the + `post_create_custom_class` interceptor. The (possibly modified) response returned by + `post_create_custom_class` will be passed to + `post_create_custom_class_with_metadata`. + """ + return response, metadata + def pre_create_phrase_set( self, request: cloud_speech_adaptation.CreatePhraseSetRequest, @@ -194,12 +217,35 @@ def post_create_phrase_set( ) -> resource.PhraseSet: """Post-rpc interceptor for create_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_create_phrase_set` interceptor runs + before the `post_create_phrase_set_with_metadata` interceptor. """ return response + def post_create_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_create_phrase_set_with_metadata` + interceptor in new development instead of the `post_create_phrase_set` interceptor. + When both interceptors are used, this `post_create_phrase_set_with_metadata` interceptor runs after the + `post_create_phrase_set` interceptor. The (possibly modified) response returned by + `post_create_phrase_set` will be passed to + `post_create_phrase_set_with_metadata`. + """ + return response, metadata + def pre_delete_custom_class( self, request: cloud_speech_adaptation.DeleteCustomClassRequest, @@ -250,12 +296,35 @@ def post_get_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for get_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_class` interceptor runs + before the `post_get_custom_class_with_metadata` interceptor. """ return response + def post_get_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_get_custom_class_with_metadata` + interceptor in new development instead of the `post_get_custom_class` interceptor. + When both interceptors are used, this `post_get_custom_class_with_metadata` interceptor runs after the + `post_get_custom_class` interceptor. The (possibly modified) response returned by + `post_get_custom_class` will be passed to + `post_get_custom_class_with_metadata`. + """ + return response, metadata + def pre_get_phrase_set( self, request: cloud_speech_adaptation.GetPhraseSetRequest, @@ -274,12 +343,35 @@ def pre_get_phrase_set( def post_get_phrase_set(self, response: resource.PhraseSet) -> resource.PhraseSet: """Post-rpc interceptor for get_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_get_phrase_set` interceptor runs + before the `post_get_phrase_set_with_metadata` interceptor. """ return response + def post_get_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_get_phrase_set_with_metadata` + interceptor in new development instead of the `post_get_phrase_set` interceptor. + When both interceptors are used, this `post_get_phrase_set_with_metadata` interceptor runs after the + `post_get_phrase_set` interceptor. The (possibly modified) response returned by + `post_get_phrase_set` will be passed to + `post_get_phrase_set_with_metadata`. + """ + return response, metadata + def pre_list_custom_classes( self, request: cloud_speech_adaptation.ListCustomClassesRequest, @@ -300,12 +392,38 @@ def post_list_custom_classes( ) -> cloud_speech_adaptation.ListCustomClassesResponse: """Post-rpc interceptor for list_custom_classes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_classes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_classes` interceptor runs + before the `post_list_custom_classes_with_metadata` interceptor. """ return response + def post_list_custom_classes_with_metadata( + self, + response: cloud_speech_adaptation.ListCustomClassesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech_adaptation.ListCustomClassesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_custom_classes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_list_custom_classes_with_metadata` + interceptor in new development instead of the `post_list_custom_classes` interceptor. + When both interceptors are used, this `post_list_custom_classes_with_metadata` interceptor runs after the + `post_list_custom_classes` interceptor. The (possibly modified) response returned by + `post_list_custom_classes` will be passed to + `post_list_custom_classes_with_metadata`. + """ + return response, metadata + def pre_list_phrase_set( self, request: cloud_speech_adaptation.ListPhraseSetRequest, @@ -326,12 +444,38 @@ def post_list_phrase_set( ) -> cloud_speech_adaptation.ListPhraseSetResponse: """Post-rpc interceptor for list_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_list_phrase_set` interceptor runs + before the `post_list_phrase_set_with_metadata` interceptor. """ return response + def post_list_phrase_set_with_metadata( + self, + response: cloud_speech_adaptation.ListPhraseSetResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech_adaptation.ListPhraseSetResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_list_phrase_set_with_metadata` + interceptor in new development instead of the `post_list_phrase_set` interceptor. + When both interceptors are used, this `post_list_phrase_set_with_metadata` interceptor runs after the + `post_list_phrase_set` interceptor. The (possibly modified) response returned by + `post_list_phrase_set` will be passed to + `post_list_phrase_set_with_metadata`. + """ + return response, metadata + def pre_update_custom_class( self, request: cloud_speech_adaptation.UpdateCustomClassRequest, @@ -352,12 +496,35 @@ def post_update_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for update_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_update_custom_class` interceptor runs + before the `post_update_custom_class_with_metadata` interceptor. """ return response + def post_update_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_update_custom_class_with_metadata` + interceptor in new development instead of the `post_update_custom_class` interceptor. + When both interceptors are used, this `post_update_custom_class_with_metadata` interceptor runs after the + `post_update_custom_class` interceptor. The (possibly modified) response returned by + `post_update_custom_class` will be passed to + `post_update_custom_class_with_metadata`. + """ + return response, metadata + def pre_update_phrase_set( self, request: cloud_speech_adaptation.UpdatePhraseSetRequest, @@ -378,12 +545,35 @@ def post_update_phrase_set( ) -> resource.PhraseSet: """Post-rpc interceptor for update_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_update_phrase_set` interceptor runs + before the `post_update_phrase_set_with_metadata` interceptor. """ return response + def post_update_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_update_phrase_set_with_metadata` + interceptor in new development instead of the `post_update_phrase_set` interceptor. + When both interceptors are used, this `post_update_phrase_set_with_metadata` interceptor runs after the + `post_update_phrase_set` interceptor. The (possibly modified) response returned by + `post_update_phrase_set` will be passed to + `post_update_phrase_set_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -654,6 +844,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -806,6 +1000,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1176,6 +1374,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1324,6 +1526,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1469,6 +1675,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_classes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_classes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1620,6 +1830,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1778,6 +1992,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1930,6 +2148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/client.py b/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/client.py index 1287454192b1..4fba9bfc1c7d 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/client.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -511,6 +513,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1172,16 +1201,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1227,16 +1260,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/transports/rest.py b/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/transports/rest.py index ba8a8052d06f..c1434d37e055 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/transports/rest.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1/services/speech/transports/rest.py @@ -111,12 +111,35 @@ def post_long_running_recognize( ) -> operations_pb2.Operation: """Post-rpc interceptor for long_running_recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_long_running_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_long_running_recognize` interceptor runs + before the `post_long_running_recognize_with_metadata` interceptor. """ return response + def post_long_running_recognize_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for long_running_recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_long_running_recognize_with_metadata` + interceptor in new development instead of the `post_long_running_recognize` interceptor. + When both interceptors are used, this `post_long_running_recognize_with_metadata` interceptor runs after the + `post_long_running_recognize` interceptor. The (possibly modified) response returned by + `post_long_running_recognize` will be passed to + `post_long_running_recognize_with_metadata`. + """ + return response, metadata + def pre_recognize( self, request: cloud_speech.RecognizeRequest, @@ -134,12 +157,35 @@ def post_recognize( ) -> cloud_speech.RecognizeResponse: """Post-rpc interceptor for recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_recognize` interceptor runs + before the `post_recognize_with_metadata` interceptor. """ return response + def post_recognize_with_metadata( + self, + response: cloud_speech.RecognizeResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.RecognizeResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_recognize_with_metadata` + interceptor in new development instead of the `post_recognize` interceptor. + When both interceptors are used, this `post_recognize_with_metadata` interceptor runs after the + `post_recognize` interceptor. The (possibly modified) response returned by + `post_recognize` will be passed to + `post_recognize_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -445,6 +491,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_long_running_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_long_running_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -595,6 +645,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/gapic_version.py b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/gapic_version.py index 2ddd49ed275f..558c8aab67c5 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/gapic_version.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.30.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/client.py b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/client.py index 53cce6750d1c..ba1e6ee580b6 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/client.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/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 @@ -507,6 +509,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. @@ -2011,16 +2040,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2066,16 +2099,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/transports/rest.py b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/transports/rest.py index e93345887d20..a4722f41c7e1 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/transports/rest.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/adaptation/transports/rest.py @@ -168,12 +168,35 @@ def post_create_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for create_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_create_custom_class` interceptor runs + before the `post_create_custom_class_with_metadata` interceptor. """ return response + def post_create_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_create_custom_class_with_metadata` + interceptor in new development instead of the `post_create_custom_class` interceptor. + When both interceptors are used, this `post_create_custom_class_with_metadata` interceptor runs after the + `post_create_custom_class` interceptor. The (possibly modified) response returned by + `post_create_custom_class` will be passed to + `post_create_custom_class_with_metadata`. + """ + return response, metadata + def pre_create_phrase_set( self, request: cloud_speech_adaptation.CreatePhraseSetRequest, @@ -194,12 +217,35 @@ def post_create_phrase_set( ) -> resource.PhraseSet: """Post-rpc interceptor for create_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_create_phrase_set` interceptor runs + before the `post_create_phrase_set_with_metadata` interceptor. """ return response + def post_create_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_create_phrase_set_with_metadata` + interceptor in new development instead of the `post_create_phrase_set` interceptor. + When both interceptors are used, this `post_create_phrase_set_with_metadata` interceptor runs after the + `post_create_phrase_set` interceptor. The (possibly modified) response returned by + `post_create_phrase_set` will be passed to + `post_create_phrase_set_with_metadata`. + """ + return response, metadata + def pre_delete_custom_class( self, request: cloud_speech_adaptation.DeleteCustomClassRequest, @@ -250,12 +296,35 @@ def post_get_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for get_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_class` interceptor runs + before the `post_get_custom_class_with_metadata` interceptor. """ return response + def post_get_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_get_custom_class_with_metadata` + interceptor in new development instead of the `post_get_custom_class` interceptor. + When both interceptors are used, this `post_get_custom_class_with_metadata` interceptor runs after the + `post_get_custom_class` interceptor. The (possibly modified) response returned by + `post_get_custom_class` will be passed to + `post_get_custom_class_with_metadata`. + """ + return response, metadata + def pre_get_phrase_set( self, request: cloud_speech_adaptation.GetPhraseSetRequest, @@ -274,12 +343,35 @@ def pre_get_phrase_set( def post_get_phrase_set(self, response: resource.PhraseSet) -> resource.PhraseSet: """Post-rpc interceptor for get_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_get_phrase_set` interceptor runs + before the `post_get_phrase_set_with_metadata` interceptor. """ return response + def post_get_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_get_phrase_set_with_metadata` + interceptor in new development instead of the `post_get_phrase_set` interceptor. + When both interceptors are used, this `post_get_phrase_set_with_metadata` interceptor runs after the + `post_get_phrase_set` interceptor. The (possibly modified) response returned by + `post_get_phrase_set` will be passed to + `post_get_phrase_set_with_metadata`. + """ + return response, metadata + def pre_list_custom_classes( self, request: cloud_speech_adaptation.ListCustomClassesRequest, @@ -300,12 +392,38 @@ def post_list_custom_classes( ) -> cloud_speech_adaptation.ListCustomClassesResponse: """Post-rpc interceptor for list_custom_classes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_classes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_classes` interceptor runs + before the `post_list_custom_classes_with_metadata` interceptor. """ return response + def post_list_custom_classes_with_metadata( + self, + response: cloud_speech_adaptation.ListCustomClassesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech_adaptation.ListCustomClassesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_custom_classes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_list_custom_classes_with_metadata` + interceptor in new development instead of the `post_list_custom_classes` interceptor. + When both interceptors are used, this `post_list_custom_classes_with_metadata` interceptor runs after the + `post_list_custom_classes` interceptor. The (possibly modified) response returned by + `post_list_custom_classes` will be passed to + `post_list_custom_classes_with_metadata`. + """ + return response, metadata + def pre_list_phrase_set( self, request: cloud_speech_adaptation.ListPhraseSetRequest, @@ -326,12 +444,38 @@ def post_list_phrase_set( ) -> cloud_speech_adaptation.ListPhraseSetResponse: """Post-rpc interceptor for list_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_list_phrase_set` interceptor runs + before the `post_list_phrase_set_with_metadata` interceptor. """ return response + def post_list_phrase_set_with_metadata( + self, + response: cloud_speech_adaptation.ListPhraseSetResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech_adaptation.ListPhraseSetResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_list_phrase_set_with_metadata` + interceptor in new development instead of the `post_list_phrase_set` interceptor. + When both interceptors are used, this `post_list_phrase_set_with_metadata` interceptor runs after the + `post_list_phrase_set` interceptor. The (possibly modified) response returned by + `post_list_phrase_set` will be passed to + `post_list_phrase_set_with_metadata`. + """ + return response, metadata + def pre_update_custom_class( self, request: cloud_speech_adaptation.UpdateCustomClassRequest, @@ -352,12 +496,35 @@ def post_update_custom_class( ) -> resource.CustomClass: """Post-rpc interceptor for update_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_update_custom_class` interceptor runs + before the `post_update_custom_class_with_metadata` interceptor. """ return response + def post_update_custom_class_with_metadata( + self, + response: resource.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_update_custom_class_with_metadata` + interceptor in new development instead of the `post_update_custom_class` interceptor. + When both interceptors are used, this `post_update_custom_class_with_metadata` interceptor runs after the + `post_update_custom_class` interceptor. The (possibly modified) response returned by + `post_update_custom_class` will be passed to + `post_update_custom_class_with_metadata`. + """ + return response, metadata + def pre_update_phrase_set( self, request: cloud_speech_adaptation.UpdatePhraseSetRequest, @@ -378,12 +545,35 @@ def post_update_phrase_set( ) -> resource.PhraseSet: """Post-rpc interceptor for update_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Adaptation server but before - it is returned to user code. + it is returned to user code. This `post_update_phrase_set` interceptor runs + before the `post_update_phrase_set_with_metadata` interceptor. """ return response + def post_update_phrase_set_with_metadata( + self, + response: resource.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[resource.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Adaptation server but before it is returned to user code. + + We recommend only using this `post_update_phrase_set_with_metadata` + interceptor in new development instead of the `post_update_phrase_set` interceptor. + When both interceptors are used, this `post_update_phrase_set_with_metadata` interceptor runs after the + `post_update_phrase_set` interceptor. The (possibly modified) response returned by + `post_update_phrase_set` will be passed to + `post_update_phrase_set_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -654,6 +844,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -806,6 +1000,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1176,6 +1374,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1324,6 +1526,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1469,6 +1675,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_classes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_classes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1620,6 +1830,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1778,6 +1992,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1930,6 +2148,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/client.py b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/client.py index cd539b827f07..c9a46560792f 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/client.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -511,6 +513,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1172,16 +1201,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1227,16 +1260,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/transports/rest.py b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/transports/rest.py index 029dfd9b7aa1..8482edb5f208 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/transports/rest.py +++ b/packages/google-cloud-speech/google/cloud/speech_v1p1beta1/services/speech/transports/rest.py @@ -111,12 +111,35 @@ def post_long_running_recognize( ) -> operations_pb2.Operation: """Post-rpc interceptor for long_running_recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_long_running_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_long_running_recognize` interceptor runs + before the `post_long_running_recognize_with_metadata` interceptor. """ return response + def post_long_running_recognize_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for long_running_recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_long_running_recognize_with_metadata` + interceptor in new development instead of the `post_long_running_recognize` interceptor. + When both interceptors are used, this `post_long_running_recognize_with_metadata` interceptor runs after the + `post_long_running_recognize` interceptor. The (possibly modified) response returned by + `post_long_running_recognize` will be passed to + `post_long_running_recognize_with_metadata`. + """ + return response, metadata + def pre_recognize( self, request: cloud_speech.RecognizeRequest, @@ -134,12 +157,35 @@ def post_recognize( ) -> cloud_speech.RecognizeResponse: """Post-rpc interceptor for recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_recognize` interceptor runs + before the `post_recognize_with_metadata` interceptor. """ return response + def post_recognize_with_metadata( + self, + response: cloud_speech.RecognizeResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.RecognizeResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_recognize_with_metadata` + interceptor in new development instead of the `post_recognize` interceptor. + When both interceptors are used, this `post_recognize_with_metadata` interceptor runs after the + `post_recognize` interceptor. The (possibly modified) response returned by + `post_recognize` will be passed to + `post_recognize_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -445,6 +491,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_long_running_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_long_running_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -595,6 +645,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-speech/google/cloud/speech_v2/gapic_version.py b/packages/google-cloud-speech/google/cloud/speech_v2/gapic_version.py index 2ddd49ed275f..558c8aab67c5 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v2/gapic_version.py +++ b/packages/google-cloud-speech/google/cloud/speech_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.30.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/client.py b/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/client.py index 002d11b2d881..eb4eb28533ce 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/client.py +++ b/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/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 @@ -607,6 +609,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. @@ -3893,16 +3922,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -3948,16 +3981,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -4114,16 +4151,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -4169,16 +4210,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/transports/rest.py b/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/transports/rest.py index 2ea8621cdcf5..6125a557c0e1 100644 --- a/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/transports/rest.py +++ b/packages/google-cloud-speech/google/cloud/speech_v2/services/speech/transports/rest.py @@ -271,12 +271,35 @@ def post_batch_recognize( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_batch_recognize` interceptor runs + before the `post_batch_recognize_with_metadata` interceptor. """ return response + def post_batch_recognize_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_batch_recognize_with_metadata` + interceptor in new development instead of the `post_batch_recognize` interceptor. + When both interceptors are used, this `post_batch_recognize_with_metadata` interceptor runs after the + `post_batch_recognize` interceptor. The (possibly modified) response returned by + `post_batch_recognize` will be passed to + `post_batch_recognize_with_metadata`. + """ + return response, metadata + def pre_create_custom_class( self, request: cloud_speech.CreateCustomClassRequest, @@ -296,12 +319,35 @@ def post_create_custom_class( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_create_custom_class` interceptor runs + before the `post_create_custom_class_with_metadata` interceptor. """ return response + def post_create_custom_class_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_create_custom_class_with_metadata` + interceptor in new development instead of the `post_create_custom_class` interceptor. + When both interceptors are used, this `post_create_custom_class_with_metadata` interceptor runs after the + `post_create_custom_class` interceptor. The (possibly modified) response returned by + `post_create_custom_class` will be passed to + `post_create_custom_class_with_metadata`. + """ + return response, metadata + def pre_create_phrase_set( self, request: cloud_speech.CreatePhraseSetRequest, @@ -321,12 +367,35 @@ def post_create_phrase_set( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_create_phrase_set` interceptor runs + before the `post_create_phrase_set_with_metadata` interceptor. """ return response + def post_create_phrase_set_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_create_phrase_set_with_metadata` + interceptor in new development instead of the `post_create_phrase_set` interceptor. + When both interceptors are used, this `post_create_phrase_set_with_metadata` interceptor runs after the + `post_create_phrase_set` interceptor. The (possibly modified) response returned by + `post_create_phrase_set` will be passed to + `post_create_phrase_set_with_metadata`. + """ + return response, metadata + def pre_create_recognizer( self, request: cloud_speech.CreateRecognizerRequest, @@ -346,12 +415,35 @@ def post_create_recognizer( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_recognizer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_recognizer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_create_recognizer` interceptor runs + before the `post_create_recognizer_with_metadata` interceptor. """ return response + def post_create_recognizer_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_recognizer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_create_recognizer_with_metadata` + interceptor in new development instead of the `post_create_recognizer` interceptor. + When both interceptors are used, this `post_create_recognizer_with_metadata` interceptor runs after the + `post_create_recognizer` interceptor. The (possibly modified) response returned by + `post_create_recognizer` will be passed to + `post_create_recognizer_with_metadata`. + """ + return response, metadata + def pre_delete_custom_class( self, request: cloud_speech.DeleteCustomClassRequest, @@ -371,12 +463,35 @@ def post_delete_custom_class( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_delete_custom_class` interceptor runs + before the `post_delete_custom_class_with_metadata` interceptor. """ return response + def post_delete_custom_class_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_delete_custom_class_with_metadata` + interceptor in new development instead of the `post_delete_custom_class` interceptor. + When both interceptors are used, this `post_delete_custom_class_with_metadata` interceptor runs after the + `post_delete_custom_class` interceptor. The (possibly modified) response returned by + `post_delete_custom_class` will be passed to + `post_delete_custom_class_with_metadata`. + """ + return response, metadata + def pre_delete_phrase_set( self, request: cloud_speech.DeletePhraseSetRequest, @@ -396,12 +511,35 @@ def post_delete_phrase_set( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_delete_phrase_set` interceptor runs + before the `post_delete_phrase_set_with_metadata` interceptor. """ return response + def post_delete_phrase_set_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_delete_phrase_set_with_metadata` + interceptor in new development instead of the `post_delete_phrase_set` interceptor. + When both interceptors are used, this `post_delete_phrase_set_with_metadata` interceptor runs after the + `post_delete_phrase_set` interceptor. The (possibly modified) response returned by + `post_delete_phrase_set` will be passed to + `post_delete_phrase_set_with_metadata`. + """ + return response, metadata + def pre_delete_recognizer( self, request: cloud_speech.DeleteRecognizerRequest, @@ -421,12 +559,35 @@ def post_delete_recognizer( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_recognizer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_recognizer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_delete_recognizer` interceptor runs + before the `post_delete_recognizer_with_metadata` interceptor. """ return response + def post_delete_recognizer_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_recognizer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_delete_recognizer_with_metadata` + interceptor in new development instead of the `post_delete_recognizer` interceptor. + When both interceptors are used, this `post_delete_recognizer_with_metadata` interceptor runs after the + `post_delete_recognizer` interceptor. The (possibly modified) response returned by + `post_delete_recognizer` will be passed to + `post_delete_recognizer_with_metadata`. + """ + return response, metadata + def pre_get_config( self, request: cloud_speech.GetConfigRequest, @@ -442,12 +603,35 @@ def pre_get_config( def post_get_config(self, response: cloud_speech.Config) -> cloud_speech.Config: """Post-rpc interceptor for get_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_get_config` interceptor runs + before the `post_get_config_with_metadata` interceptor. """ return response + def post_get_config_with_metadata( + self, + response: cloud_speech.Config, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.Config, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_get_config_with_metadata` + interceptor in new development instead of the `post_get_config` interceptor. + When both interceptors are used, this `post_get_config_with_metadata` interceptor runs after the + `post_get_config` interceptor. The (possibly modified) response returned by + `post_get_config` will be passed to + `post_get_config_with_metadata`. + """ + return response, metadata + def pre_get_custom_class( self, request: cloud_speech.GetCustomClassRequest, @@ -467,12 +651,35 @@ def post_get_custom_class( ) -> cloud_speech.CustomClass: """Post-rpc interceptor for get_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_get_custom_class` interceptor runs + before the `post_get_custom_class_with_metadata` interceptor. """ return response + def post_get_custom_class_with_metadata( + self, + response: cloud_speech.CustomClass, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.CustomClass, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_get_custom_class_with_metadata` + interceptor in new development instead of the `post_get_custom_class` interceptor. + When both interceptors are used, this `post_get_custom_class_with_metadata` interceptor runs after the + `post_get_custom_class` interceptor. The (possibly modified) response returned by + `post_get_custom_class` will be passed to + `post_get_custom_class_with_metadata`. + """ + return response, metadata + def pre_get_phrase_set( self, request: cloud_speech.GetPhraseSetRequest, @@ -492,12 +699,35 @@ def post_get_phrase_set( ) -> cloud_speech.PhraseSet: """Post-rpc interceptor for get_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_get_phrase_set` interceptor runs + before the `post_get_phrase_set_with_metadata` interceptor. """ return response + def post_get_phrase_set_with_metadata( + self, + response: cloud_speech.PhraseSet, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.PhraseSet, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_get_phrase_set_with_metadata` + interceptor in new development instead of the `post_get_phrase_set` interceptor. + When both interceptors are used, this `post_get_phrase_set_with_metadata` interceptor runs after the + `post_get_phrase_set` interceptor. The (possibly modified) response returned by + `post_get_phrase_set` will be passed to + `post_get_phrase_set_with_metadata`. + """ + return response, metadata + def pre_get_recognizer( self, request: cloud_speech.GetRecognizerRequest, @@ -517,12 +747,35 @@ def post_get_recognizer( ) -> cloud_speech.Recognizer: """Post-rpc interceptor for get_recognizer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_recognizer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_get_recognizer` interceptor runs + before the `post_get_recognizer_with_metadata` interceptor. """ return response + def post_get_recognizer_with_metadata( + self, + response: cloud_speech.Recognizer, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.Recognizer, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_recognizer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_get_recognizer_with_metadata` + interceptor in new development instead of the `post_get_recognizer` interceptor. + When both interceptors are used, this `post_get_recognizer_with_metadata` interceptor runs after the + `post_get_recognizer` interceptor. The (possibly modified) response returned by + `post_get_recognizer` will be passed to + `post_get_recognizer_with_metadata`. + """ + return response, metadata + def pre_list_custom_classes( self, request: cloud_speech.ListCustomClassesRequest, @@ -542,12 +795,37 @@ def post_list_custom_classes( ) -> cloud_speech.ListCustomClassesResponse: """Post-rpc interceptor for list_custom_classes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_custom_classes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_list_custom_classes` interceptor runs + before the `post_list_custom_classes_with_metadata` interceptor. """ return response + def post_list_custom_classes_with_metadata( + self, + response: cloud_speech.ListCustomClassesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech.ListCustomClassesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_custom_classes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_list_custom_classes_with_metadata` + interceptor in new development instead of the `post_list_custom_classes` interceptor. + When both interceptors are used, this `post_list_custom_classes_with_metadata` interceptor runs after the + `post_list_custom_classes` interceptor. The (possibly modified) response returned by + `post_list_custom_classes` will be passed to + `post_list_custom_classes_with_metadata`. + """ + return response, metadata + def pre_list_phrase_sets( self, request: cloud_speech.ListPhraseSetsRequest, @@ -567,12 +845,37 @@ def post_list_phrase_sets( ) -> cloud_speech.ListPhraseSetsResponse: """Post-rpc interceptor for list_phrase_sets - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_phrase_sets_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_list_phrase_sets` interceptor runs + before the `post_list_phrase_sets_with_metadata` interceptor. """ return response + def post_list_phrase_sets_with_metadata( + self, + response: cloud_speech.ListPhraseSetsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech.ListPhraseSetsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_phrase_sets + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_list_phrase_sets_with_metadata` + interceptor in new development instead of the `post_list_phrase_sets` interceptor. + When both interceptors are used, this `post_list_phrase_sets_with_metadata` interceptor runs after the + `post_list_phrase_sets` interceptor. The (possibly modified) response returned by + `post_list_phrase_sets` will be passed to + `post_list_phrase_sets_with_metadata`. + """ + return response, metadata + def pre_list_recognizers( self, request: cloud_speech.ListRecognizersRequest, @@ -592,12 +895,37 @@ def post_list_recognizers( ) -> cloud_speech.ListRecognizersResponse: """Post-rpc interceptor for list_recognizers - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_recognizers_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_list_recognizers` interceptor runs + before the `post_list_recognizers_with_metadata` interceptor. """ return response + def post_list_recognizers_with_metadata( + self, + response: cloud_speech.ListRecognizersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_speech.ListRecognizersResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_recognizers + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_list_recognizers_with_metadata` + interceptor in new development instead of the `post_list_recognizers` interceptor. + When both interceptors are used, this `post_list_recognizers_with_metadata` interceptor runs after the + `post_list_recognizers` interceptor. The (possibly modified) response returned by + `post_list_recognizers` will be passed to + `post_list_recognizers_with_metadata`. + """ + return response, metadata + def pre_recognize( self, request: cloud_speech.RecognizeRequest, @@ -615,12 +943,35 @@ def post_recognize( ) -> cloud_speech.RecognizeResponse: """Post-rpc interceptor for recognize - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_recognize_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_recognize` interceptor runs + before the `post_recognize_with_metadata` interceptor. """ return response + def post_recognize_with_metadata( + self, + response: cloud_speech.RecognizeResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.RecognizeResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for recognize + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_recognize_with_metadata` + interceptor in new development instead of the `post_recognize` interceptor. + When both interceptors are used, this `post_recognize_with_metadata` interceptor runs after the + `post_recognize` interceptor. The (possibly modified) response returned by + `post_recognize` will be passed to + `post_recognize_with_metadata`. + """ + return response, metadata + def pre_undelete_custom_class( self, request: cloud_speech.UndeleteCustomClassRequest, @@ -640,12 +991,35 @@ def post_undelete_custom_class( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_undelete_custom_class` interceptor runs + before the `post_undelete_custom_class_with_metadata` interceptor. """ return response + def post_undelete_custom_class_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for undelete_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_undelete_custom_class_with_metadata` + interceptor in new development instead of the `post_undelete_custom_class` interceptor. + When both interceptors are used, this `post_undelete_custom_class_with_metadata` interceptor runs after the + `post_undelete_custom_class` interceptor. The (possibly modified) response returned by + `post_undelete_custom_class` will be passed to + `post_undelete_custom_class_with_metadata`. + """ + return response, metadata + def pre_undelete_phrase_set( self, request: cloud_speech.UndeletePhraseSetRequest, @@ -665,12 +1039,35 @@ def post_undelete_phrase_set( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_undelete_phrase_set` interceptor runs + before the `post_undelete_phrase_set_with_metadata` interceptor. """ return response + def post_undelete_phrase_set_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for undelete_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_undelete_phrase_set_with_metadata` + interceptor in new development instead of the `post_undelete_phrase_set` interceptor. + When both interceptors are used, this `post_undelete_phrase_set_with_metadata` interceptor runs after the + `post_undelete_phrase_set` interceptor. The (possibly modified) response returned by + `post_undelete_phrase_set` will be passed to + `post_undelete_phrase_set_with_metadata`. + """ + return response, metadata + def pre_undelete_recognizer( self, request: cloud_speech.UndeleteRecognizerRequest, @@ -690,12 +1087,35 @@ def post_undelete_recognizer( ) -> operations_pb2.Operation: """Post-rpc interceptor for undelete_recognizer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_undelete_recognizer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_undelete_recognizer` interceptor runs + before the `post_undelete_recognizer_with_metadata` interceptor. """ return response + def post_undelete_recognizer_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for undelete_recognizer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_undelete_recognizer_with_metadata` + interceptor in new development instead of the `post_undelete_recognizer` interceptor. + When both interceptors are used, this `post_undelete_recognizer_with_metadata` interceptor runs after the + `post_undelete_recognizer` interceptor. The (possibly modified) response returned by + `post_undelete_recognizer` will be passed to + `post_undelete_recognizer_with_metadata`. + """ + return response, metadata + def pre_update_config( self, request: cloud_speech.UpdateConfigRequest, @@ -713,12 +1133,35 @@ def pre_update_config( def post_update_config(self, response: cloud_speech.Config) -> cloud_speech.Config: """Post-rpc interceptor for update_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_update_config` interceptor runs + before the `post_update_config_with_metadata` interceptor. """ return response + def post_update_config_with_metadata( + self, + response: cloud_speech.Config, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_speech.Config, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_update_config_with_metadata` + interceptor in new development instead of the `post_update_config` interceptor. + When both interceptors are used, this `post_update_config_with_metadata` interceptor runs after the + `post_update_config` interceptor. The (possibly modified) response returned by + `post_update_config` will be passed to + `post_update_config_with_metadata`. + """ + return response, metadata + def pre_update_custom_class( self, request: cloud_speech.UpdateCustomClassRequest, @@ -738,12 +1181,35 @@ def post_update_custom_class( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_custom_class - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_custom_class_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_update_custom_class` interceptor runs + before the `post_update_custom_class_with_metadata` interceptor. """ return response + def post_update_custom_class_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_custom_class + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_update_custom_class_with_metadata` + interceptor in new development instead of the `post_update_custom_class` interceptor. + When both interceptors are used, this `post_update_custom_class_with_metadata` interceptor runs after the + `post_update_custom_class` interceptor. The (possibly modified) response returned by + `post_update_custom_class` will be passed to + `post_update_custom_class_with_metadata`. + """ + return response, metadata + def pre_update_phrase_set( self, request: cloud_speech.UpdatePhraseSetRequest, @@ -763,12 +1229,35 @@ def post_update_phrase_set( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_phrase_set - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_phrase_set_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_update_phrase_set` interceptor runs + before the `post_update_phrase_set_with_metadata` interceptor. """ return response + def post_update_phrase_set_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_phrase_set + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_update_phrase_set_with_metadata` + interceptor in new development instead of the `post_update_phrase_set` interceptor. + When both interceptors are used, this `post_update_phrase_set_with_metadata` interceptor runs after the + `post_update_phrase_set` interceptor. The (possibly modified) response returned by + `post_update_phrase_set` will be passed to + `post_update_phrase_set_with_metadata`. + """ + return response, metadata + def pre_update_recognizer( self, request: cloud_speech.UpdateRecognizerRequest, @@ -788,12 +1277,35 @@ def post_update_recognizer( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_recognizer - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_recognizer_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Speech server but before - it is returned to user code. + it is returned to user code. This `post_update_recognizer` interceptor runs + before the `post_update_recognizer_with_metadata` interceptor. """ return response + def post_update_recognizer_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_recognizer + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Speech server but before it is returned to user code. + + We recommend only using this `post_update_recognizer_with_metadata` + interceptor in new development instead of the `post_update_recognizer` interceptor. + When both interceptors are used, this `post_update_recognizer_with_metadata` interceptor runs after the + `post_update_recognizer` interceptor. The (possibly modified) response returned by + `post_update_recognizer` will be passed to + `post_update_recognizer_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1209,6 +1721,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1366,6 +1882,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1521,6 +2041,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1678,6 +2202,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_recognizer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_recognizer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1827,6 +2355,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1976,6 +2508,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2125,6 +2661,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_recognizer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_recognizer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2271,6 +2811,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2423,6 +2967,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2572,6 +3120,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2718,6 +3270,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_recognizer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_recognizer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2869,6 +3425,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_custom_classes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_custom_classes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3020,6 +3580,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_phrase_sets(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_phrase_sets_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3173,6 +3737,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_recognizers(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_recognizers_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3330,6 +3898,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_recognize(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_recognize_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3499,6 +4071,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3656,6 +4232,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3811,6 +4391,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_undelete_recognizer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_undelete_recognizer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3965,6 +4549,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4122,6 +4710,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_custom_class(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_custom_class_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4277,6 +4869,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_phrase_set(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_phrase_set_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4434,6 +5030,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_recognizer(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_recognizer_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1.json b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1.json index 51ece23514fc..93236a91bf54 100644 --- a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1.json +++ b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-speech", - "version": "2.30.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1p1beta1.json b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1p1beta1.json index 45ffc45ee82a..3b43da242b1d 100644 --- a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1p1beta1.json +++ b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v1p1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-speech", - "version": "2.30.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v2.json b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v2.json index 1d8d0c2ad675..dc8cd78439ea 100644 --- a/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v2.json +++ b/packages/google-cloud-speech/samples/generated_samples/snippet_metadata_google.cloud.speech.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-speech", - "version": "2.30.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_adaptation.py b/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_adaptation.py index feed5ad09d1f..f34cce513b2e 100644 --- a/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_adaptation.py +++ b/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_adaptation.py @@ -62,6 +62,13 @@ ) from google.cloud.speech_v1.types import cloud_speech_adaptation, resource +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = AdaptationClient(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 = AdaptationClient(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", [ @@ -7549,10 +7599,13 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_create_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_create_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_create_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.CreatePhraseSetRequest.pb( cloud_speech_adaptation.CreatePhraseSetRequest() ) @@ -7576,6 +7629,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.create_phrase_set( request, @@ -7587,6 +7641,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_phrase_set_rest_bad_request( @@ -7673,10 +7728,13 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_get_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_get_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_get_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.GetPhraseSetRequest.pb( cloud_speech_adaptation.GetPhraseSetRequest() ) @@ -7700,6 +7758,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.get_phrase_set( request, @@ -7711,6 +7770,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_phrase_set_rest_bad_request( @@ -7795,10 +7855,13 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_list_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_list_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_list_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.ListPhraseSetRequest.pb( cloud_speech_adaptation.ListPhraseSetRequest() ) @@ -7824,6 +7887,10 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech_adaptation.ListPhraseSetResponse() + post_with_metadata.return_value = ( + cloud_speech_adaptation.ListPhraseSetResponse(), + metadata, + ) client.list_phrase_set( request, @@ -7835,6 +7902,7 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_phrase_set_rest_bad_request( @@ -7999,10 +8067,13 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_update_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_update_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_update_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.UpdatePhraseSetRequest.pb( cloud_speech_adaptation.UpdatePhraseSetRequest() ) @@ -8026,6 +8097,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.update_phrase_set( request, @@ -8037,6 +8109,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_phrase_set_rest_bad_request( @@ -8232,10 +8305,13 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_create_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_create_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_create_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.CreateCustomClassRequest.pb( cloud_speech_adaptation.CreateCustomClassRequest() ) @@ -8259,6 +8335,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.create_custom_class( request, @@ -8270,6 +8347,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_custom_class_rest_bad_request( @@ -8356,10 +8434,13 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_get_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_get_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_get_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.GetCustomClassRequest.pb( cloud_speech_adaptation.GetCustomClassRequest() ) @@ -8383,6 +8464,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.get_custom_class( request, @@ -8394,6 +8476,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_classes_rest_bad_request( @@ -8480,10 +8563,13 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_list_custom_classes" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_list_custom_classes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_list_custom_classes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.ListCustomClassesRequest.pb( cloud_speech_adaptation.ListCustomClassesRequest() ) @@ -8509,6 +8595,10 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech_adaptation.ListCustomClassesResponse() + post_with_metadata.return_value = ( + cloud_speech_adaptation.ListCustomClassesResponse(), + metadata, + ) client.list_custom_classes( request, @@ -8520,6 +8610,7 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_custom_class_rest_bad_request( @@ -8688,10 +8779,13 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_update_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_update_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_update_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.UpdateCustomClassRequest.pb( cloud_speech_adaptation.UpdateCustomClassRequest() ) @@ -8715,6 +8809,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.update_custom_class( request, @@ -8726,6 +8821,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_custom_class_rest_bad_request( diff --git a/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_speech.py b/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_speech.py index 501d0da596bd..992bbc8608d9 100644 --- a/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_speech.py +++ b/packages/google-cloud-speech/tests/unit/gapic/speech_v1/test_speech.py @@ -72,6 +72,13 @@ ) from google.cloud.speech_v1.types import cloud_speech, resource +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = SpeechClient(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 = SpeechClient(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", [ @@ -2440,10 +2490,13 @@ def test_recognize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.RecognizeRequest.pb(cloud_speech.RecognizeRequest()) transcode.return_value = { "method": "post", @@ -2467,6 +2520,7 @@ def test_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.RecognizeResponse() + post_with_metadata.return_value = cloud_speech.RecognizeResponse(), metadata client.recognize( request, @@ -2478,6 +2532,7 @@ def test_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_long_running_recognize_rest_bad_request( @@ -2556,10 +2611,13 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_long_running_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_long_running_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_long_running_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.LongRunningRecognizeRequest.pb( cloud_speech.LongRunningRecognizeRequest() ) @@ -2583,6 +2641,7 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.long_running_recognize( request, @@ -2594,6 +2653,7 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_streaming_recognize_rest_error(): diff --git a/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py b/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py index 1ffdbfe29c25..aee632870d0e 100644 --- a/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py +++ b/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_adaptation.py @@ -62,6 +62,13 @@ ) from google.cloud.speech_v1p1beta1.types import cloud_speech_adaptation, resource +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = AdaptationClient(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 = AdaptationClient(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", [ @@ -7553,10 +7603,13 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_create_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_create_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_create_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.CreatePhraseSetRequest.pb( cloud_speech_adaptation.CreatePhraseSetRequest() ) @@ -7580,6 +7633,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.create_phrase_set( request, @@ -7591,6 +7645,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_phrase_set_rest_bad_request( @@ -7677,10 +7732,13 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_get_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_get_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_get_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.GetPhraseSetRequest.pb( cloud_speech_adaptation.GetPhraseSetRequest() ) @@ -7704,6 +7762,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.get_phrase_set( request, @@ -7715,6 +7774,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_phrase_set_rest_bad_request( @@ -7799,10 +7859,13 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_list_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_list_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_list_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.ListPhraseSetRequest.pb( cloud_speech_adaptation.ListPhraseSetRequest() ) @@ -7828,6 +7891,10 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech_adaptation.ListPhraseSetResponse() + post_with_metadata.return_value = ( + cloud_speech_adaptation.ListPhraseSetResponse(), + metadata, + ) client.list_phrase_set( request, @@ -7839,6 +7906,7 @@ def test_list_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_phrase_set_rest_bad_request( @@ -8003,10 +8071,13 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_update_phrase_set" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_update_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_update_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.UpdatePhraseSetRequest.pb( cloud_speech_adaptation.UpdatePhraseSetRequest() ) @@ -8030,6 +8101,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.PhraseSet() + post_with_metadata.return_value = resource.PhraseSet(), metadata client.update_phrase_set( request, @@ -8041,6 +8113,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_phrase_set_rest_bad_request( @@ -8236,10 +8309,13 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_create_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_create_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_create_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.CreateCustomClassRequest.pb( cloud_speech_adaptation.CreateCustomClassRequest() ) @@ -8263,6 +8339,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.create_custom_class( request, @@ -8274,6 +8351,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_custom_class_rest_bad_request( @@ -8360,10 +8438,13 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_get_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_get_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_get_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.GetCustomClassRequest.pb( cloud_speech_adaptation.GetCustomClassRequest() ) @@ -8387,6 +8468,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.get_custom_class( request, @@ -8398,6 +8480,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_classes_rest_bad_request( @@ -8484,10 +8567,13 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_list_custom_classes" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_list_custom_classes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_list_custom_classes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.ListCustomClassesRequest.pb( cloud_speech_adaptation.ListCustomClassesRequest() ) @@ -8513,6 +8599,10 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech_adaptation.ListCustomClassesResponse() + post_with_metadata.return_value = ( + cloud_speech_adaptation.ListCustomClassesResponse(), + metadata, + ) client.list_custom_classes( request, @@ -8524,6 +8614,7 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_custom_class_rest_bad_request( @@ -8692,10 +8783,13 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.AdaptationRestInterceptor, "post_update_custom_class" ) as post, mock.patch.object( + transports.AdaptationRestInterceptor, "post_update_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.AdaptationRestInterceptor, "pre_update_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech_adaptation.UpdateCustomClassRequest.pb( cloud_speech_adaptation.UpdateCustomClassRequest() ) @@ -8719,6 +8813,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = resource.CustomClass() + post_with_metadata.return_value = resource.CustomClass(), metadata client.update_custom_class( request, @@ -8730,6 +8825,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_custom_class_rest_bad_request( diff --git a/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_speech.py b/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_speech.py index adbe6c874018..7fef592fa9c3 100644 --- a/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_speech.py +++ b/packages/google-cloud-speech/tests/unit/gapic/speech_v1p1beta1/test_speech.py @@ -72,6 +72,13 @@ ) from google.cloud.speech_v1p1beta1.types import cloud_speech, resource +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = SpeechClient(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 = SpeechClient(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", [ @@ -2440,10 +2490,13 @@ def test_recognize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.RecognizeRequest.pb(cloud_speech.RecognizeRequest()) transcode.return_value = { "method": "post", @@ -2467,6 +2520,7 @@ def test_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.RecognizeResponse() + post_with_metadata.return_value = cloud_speech.RecognizeResponse(), metadata client.recognize( request, @@ -2478,6 +2532,7 @@ def test_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_long_running_recognize_rest_bad_request( @@ -2556,10 +2611,13 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_long_running_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_long_running_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_long_running_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.LongRunningRecognizeRequest.pb( cloud_speech.LongRunningRecognizeRequest() ) @@ -2583,6 +2641,7 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.long_running_recognize( request, @@ -2594,6 +2653,7 @@ def test_long_running_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_streaming_recognize_rest_error(): diff --git a/packages/google-cloud-speech/tests/unit/gapic/speech_v2/test_speech.py b/packages/google-cloud-speech/tests/unit/gapic/speech_v2/test_speech.py index a432786ad9c0..cf17aee93b04 100644 --- a/packages/google-cloud-speech/tests/unit/gapic/speech_v2/test_speech.py +++ b/packages/google-cloud-speech/tests/unit/gapic/speech_v2/test_speech.py @@ -74,6 +74,13 @@ ) from google.cloud.speech_v2.types import cloud_speech +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 = SpeechClient(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 = SpeechClient(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", [ @@ -15289,10 +15339,13 @@ def test_create_recognizer_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_create_recognizer" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_create_recognizer_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_create_recognizer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.CreateRecognizerRequest.pb( cloud_speech.CreateRecognizerRequest() ) @@ -15316,6 +15369,7 @@ def test_create_recognizer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_recognizer( request, @@ -15327,6 +15381,7 @@ def test_create_recognizer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_recognizers_rest_bad_request( @@ -15409,10 +15464,13 @@ def test_list_recognizers_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_list_recognizers" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_list_recognizers_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_list_recognizers" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.ListRecognizersRequest.pb( cloud_speech.ListRecognizersRequest() ) @@ -15438,6 +15496,10 @@ def test_list_recognizers_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.ListRecognizersResponse() + post_with_metadata.return_value = ( + cloud_speech.ListRecognizersResponse(), + metadata, + ) client.list_recognizers( request, @@ -15449,6 +15511,7 @@ def test_list_recognizers_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_recognizer_rest_bad_request( @@ -15549,10 +15612,13 @@ def test_get_recognizer_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_get_recognizer" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_get_recognizer_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_get_recognizer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.GetRecognizerRequest.pb( cloud_speech.GetRecognizerRequest() ) @@ -15576,6 +15642,7 @@ def test_get_recognizer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.Recognizer() + post_with_metadata.return_value = cloud_speech.Recognizer(), metadata client.get_recognizer( request, @@ -15587,6 +15654,7 @@ def test_get_recognizer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_recognizer_rest_bad_request( @@ -15829,10 +15897,13 @@ def test_update_recognizer_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_update_recognizer" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_update_recognizer_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_update_recognizer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UpdateRecognizerRequest.pb( cloud_speech.UpdateRecognizerRequest() ) @@ -15856,6 +15927,7 @@ def test_update_recognizer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_recognizer( request, @@ -15867,6 +15939,7 @@ def test_update_recognizer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_recognizer_rest_bad_request( @@ -15945,10 +16018,13 @@ def test_delete_recognizer_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_delete_recognizer" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_delete_recognizer_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_delete_recognizer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.DeleteRecognizerRequest.pb( cloud_speech.DeleteRecognizerRequest() ) @@ -15972,6 +16048,7 @@ def test_delete_recognizer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_recognizer( request, @@ -15983,6 +16060,7 @@ def test_delete_recognizer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_recognizer_rest_bad_request( @@ -16061,10 +16139,13 @@ def test_undelete_recognizer_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_undelete_recognizer" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_undelete_recognizer_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_undelete_recognizer" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UndeleteRecognizerRequest.pb( cloud_speech.UndeleteRecognizerRequest() ) @@ -16088,6 +16169,7 @@ def test_undelete_recognizer_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.undelete_recognizer( request, @@ -16099,6 +16181,7 @@ def test_undelete_recognizer_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_recognize_rest_bad_request(request_type=cloud_speech.RecognizeRequest): @@ -16180,10 +16263,13 @@ def test_recognize_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.RecognizeRequest.pb(cloud_speech.RecognizeRequest()) transcode.return_value = { "method": "post", @@ -16207,6 +16293,7 @@ def test_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.RecognizeResponse() + post_with_metadata.return_value = cloud_speech.RecognizeResponse(), metadata client.recognize( request, @@ -16218,6 +16305,7 @@ def test_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_streaming_recognize_rest_error(): @@ -16312,10 +16400,13 @@ def test_batch_recognize_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_batch_recognize" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_batch_recognize_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_batch_recognize" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.BatchRecognizeRequest.pb( cloud_speech.BatchRecognizeRequest() ) @@ -16339,6 +16430,7 @@ def test_batch_recognize_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_recognize( request, @@ -16350,6 +16442,7 @@ def test_batch_recognize_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_config_rest_bad_request(request_type=cloud_speech.GetConfigRequest): @@ -16432,10 +16525,13 @@ def test_get_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_get_config" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_get_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_get_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.GetConfigRequest.pb(cloud_speech.GetConfigRequest()) transcode.return_value = { "method": "post", @@ -16457,6 +16553,7 @@ def test_get_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.Config() + post_with_metadata.return_value = cloud_speech.Config(), metadata client.get_config( request, @@ -16468,6 +16565,7 @@ def test_get_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_config_rest_bad_request(request_type=cloud_speech.UpdateConfigRequest): @@ -16622,10 +16720,13 @@ def test_update_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_update_config" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_update_config_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_update_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UpdateConfigRequest.pb( cloud_speech.UpdateConfigRequest() ) @@ -16649,6 +16750,7 @@ def test_update_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.Config() + post_with_metadata.return_value = cloud_speech.Config(), metadata client.update_config( request, @@ -16660,6 +16762,7 @@ def test_update_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_custom_class_rest_bad_request( @@ -16821,10 +16924,13 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_create_custom_class" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_create_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_create_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.CreateCustomClassRequest.pb( cloud_speech.CreateCustomClassRequest() ) @@ -16848,6 +16954,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_custom_class( request, @@ -16859,6 +16966,7 @@ def test_create_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_custom_classes_rest_bad_request( @@ -16941,10 +17049,13 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_list_custom_classes" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_list_custom_classes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_list_custom_classes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.ListCustomClassesRequest.pb( cloud_speech.ListCustomClassesRequest() ) @@ -16970,6 +17081,10 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.ListCustomClassesResponse() + post_with_metadata.return_value = ( + cloud_speech.ListCustomClassesResponse(), + metadata, + ) client.list_custom_classes( request, @@ -16981,6 +17096,7 @@ def test_list_custom_classes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_custom_class_rest_bad_request( @@ -17077,10 +17193,13 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_get_custom_class" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_get_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_get_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.GetCustomClassRequest.pb( cloud_speech.GetCustomClassRequest() ) @@ -17104,6 +17223,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.CustomClass() + post_with_metadata.return_value = cloud_speech.CustomClass(), metadata client.get_custom_class( request, @@ -17115,6 +17235,7 @@ def test_get_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_custom_class_rest_bad_request( @@ -17284,10 +17405,13 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_update_custom_class" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_update_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_update_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UpdateCustomClassRequest.pb( cloud_speech.UpdateCustomClassRequest() ) @@ -17311,6 +17435,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_custom_class( request, @@ -17322,6 +17447,7 @@ def test_update_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_custom_class_rest_bad_request( @@ -17400,10 +17526,13 @@ def test_delete_custom_class_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_delete_custom_class" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_delete_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_delete_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.DeleteCustomClassRequest.pb( cloud_speech.DeleteCustomClassRequest() ) @@ -17427,6 +17556,7 @@ def test_delete_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_custom_class( request, @@ -17438,6 +17568,7 @@ def test_delete_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_custom_class_rest_bad_request( @@ -17516,10 +17647,13 @@ def test_undelete_custom_class_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_undelete_custom_class" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_undelete_custom_class_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_undelete_custom_class" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UndeleteCustomClassRequest.pb( cloud_speech.UndeleteCustomClassRequest() ) @@ -17543,6 +17677,7 @@ def test_undelete_custom_class_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.undelete_custom_class( request, @@ -17554,6 +17689,7 @@ def test_undelete_custom_class_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_phrase_set_rest_bad_request( @@ -17716,10 +17852,13 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_create_phrase_set" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_create_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_create_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.CreatePhraseSetRequest.pb( cloud_speech.CreatePhraseSetRequest() ) @@ -17743,6 +17882,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_phrase_set( request, @@ -17754,6 +17894,7 @@ def test_create_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_phrase_sets_rest_bad_request( @@ -17836,10 +17977,13 @@ def test_list_phrase_sets_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_list_phrase_sets" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_list_phrase_sets_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_list_phrase_sets" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.ListPhraseSetsRequest.pb( cloud_speech.ListPhraseSetsRequest() ) @@ -17865,6 +18009,10 @@ def test_list_phrase_sets_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.ListPhraseSetsResponse() + post_with_metadata.return_value = ( + cloud_speech.ListPhraseSetsResponse(), + metadata, + ) client.list_phrase_sets( request, @@ -17876,6 +18024,7 @@ def test_list_phrase_sets_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_phrase_set_rest_bad_request(request_type=cloud_speech.GetPhraseSetRequest): @@ -17972,10 +18121,13 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.SpeechRestInterceptor, "post_get_phrase_set" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_get_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_get_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.GetPhraseSetRequest.pb( cloud_speech.GetPhraseSetRequest() ) @@ -17999,6 +18151,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_speech.PhraseSet() + post_with_metadata.return_value = cloud_speech.PhraseSet(), metadata client.get_phrase_set( request, @@ -18010,6 +18163,7 @@ def test_get_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_phrase_set_rest_bad_request( @@ -18176,10 +18330,13 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_update_phrase_set" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_update_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_update_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UpdatePhraseSetRequest.pb( cloud_speech.UpdatePhraseSetRequest() ) @@ -18203,6 +18360,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_phrase_set( request, @@ -18214,6 +18372,7 @@ def test_update_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_phrase_set_rest_bad_request( @@ -18292,10 +18451,13 @@ def test_delete_phrase_set_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_delete_phrase_set" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_delete_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_delete_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.DeletePhraseSetRequest.pb( cloud_speech.DeletePhraseSetRequest() ) @@ -18319,6 +18481,7 @@ def test_delete_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_phrase_set( request, @@ -18330,6 +18493,7 @@ def test_delete_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_undelete_phrase_set_rest_bad_request( @@ -18408,10 +18572,13 @@ def test_undelete_phrase_set_rest_interceptors(null_interceptor): ), mock.patch.object( transports.SpeechRestInterceptor, "post_undelete_phrase_set" ) as post, mock.patch.object( + transports.SpeechRestInterceptor, "post_undelete_phrase_set_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.SpeechRestInterceptor, "pre_undelete_phrase_set" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_speech.UndeletePhraseSetRequest.pb( cloud_speech.UndeletePhraseSetRequest() ) @@ -18435,6 +18602,7 @@ def test_undelete_phrase_set_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.undelete_phrase_set( request, @@ -18446,6 +18614,7 @@ def test_undelete_phrase_set_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-storage-control/google/cloud/storage_control/gapic_version.py b/packages/google-cloud-storage-control/google/cloud/storage_control/gapic_version.py index 9532349ff9e4..558c8aab67c5 100644 --- a/packages/google-cloud-storage-control/google/cloud/storage_control/gapic_version.py +++ b/packages/google-cloud-storage-control/google/cloud/storage_control/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.2.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storage-control/google/cloud/storage_control_v2/gapic_version.py b/packages/google-cloud-storage-control/google/cloud/storage_control_v2/gapic_version.py index 9532349ff9e4..558c8aab67c5 100644 --- a/packages/google-cloud-storage-control/google/cloud/storage_control_v2/gapic_version.py +++ b/packages/google-cloud-storage-control/google/cloud/storage_control_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.2.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storage-control/google/cloud/storage_control_v2/services/storage_control/client.py b/packages/google-cloud-storage-control/google/cloud/storage_control_v2/services/storage_control/client.py index ada9fb8ed0a8..bb4014c39197 100644 --- a/packages/google-cloud-storage-control/google/cloud/storage_control_v2/services/storage_control/client.py +++ b/packages/google-cloud-storage-control/google/cloud/storage_control_v2/services/storage_control/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -531,6 +533,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-storage-control/samples/generated_samples/snippet_metadata_google.storage.control.v2.json b/packages/google-cloud-storage-control/samples/generated_samples/snippet_metadata_google.storage.control.v2.json index 8ee32b8e77ba..13ffe2cf1f9d 100644 --- a/packages/google-cloud-storage-control/samples/generated_samples/snippet_metadata_google.storage.control.v2.json +++ b/packages/google-cloud-storage-control/samples/generated_samples/snippet_metadata_google.storage.control.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage-control", - "version": "1.2.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-storage-control/tests/unit/gapic/storage_control_v2/test_storage_control.py b/packages/google-cloud-storage-control/tests/unit/gapic/storage_control_v2/test_storage_control.py index 98294ef656fd..d82c93fd2418 100644 --- a/packages/google-cloud-storage-control/tests/unit/gapic/storage_control_v2/test_storage_control.py +++ b/packages/google-cloud-storage-control/tests/unit/gapic/storage_control_v2/test_storage_control.py @@ -23,6 +23,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -67,6 +68,13 @@ ) from google.cloud.storage_control_v2.types import storage_control +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -325,6 +333,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = StorageControlClient(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 = StorageControlClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ diff --git a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer/gapic_version.py b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer/gapic_version.py +++ b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.15.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/gapic_version.py b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/gapic_version.py index cf18a472a8a2..558c8aab67c5 100644 --- a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/gapic_version.py +++ b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.15.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/client.py b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/client.py index f69774ff217a..2cbb22eb3e6b 100644 --- a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/client.py +++ b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -493,6 +495,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2120,16 +2149,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2175,16 +2208,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def cancel_operation( self, diff --git a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/transports/rest.py b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/transports/rest.py index 5c1ae349882c..1bb3f96fc7eb 100644 --- a/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/transports/rest.py +++ b/packages/google-cloud-storage-transfer/google/cloud/storage_transfer_v1/services/storage_transfer_service/transports/rest.py @@ -191,12 +191,35 @@ def post_create_agent_pool( ) -> transfer_types.AgentPool: """Post-rpc interceptor for create_agent_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_agent_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_create_agent_pool` interceptor runs + before the `post_create_agent_pool_with_metadata` interceptor. """ return response + def post_create_agent_pool_with_metadata( + self, + response: transfer_types.AgentPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.AgentPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_agent_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_create_agent_pool_with_metadata` + interceptor in new development instead of the `post_create_agent_pool` interceptor. + When both interceptors are used, this `post_create_agent_pool_with_metadata` interceptor runs after the + `post_create_agent_pool` interceptor. The (possibly modified) response returned by + `post_create_agent_pool` will be passed to + `post_create_agent_pool_with_metadata`. + """ + return response, metadata + def pre_create_transfer_job( self, request: transfer.CreateTransferJobRequest, @@ -216,12 +239,35 @@ def post_create_transfer_job( ) -> transfer_types.TransferJob: """Post-rpc interceptor for create_transfer_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_transfer_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_create_transfer_job` interceptor runs + before the `post_create_transfer_job_with_metadata` interceptor. """ return response + def post_create_transfer_job_with_metadata( + self, + response: transfer_types.TransferJob, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.TransferJob, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_transfer_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_create_transfer_job_with_metadata` + interceptor in new development instead of the `post_create_transfer_job` interceptor. + When both interceptors are used, this `post_create_transfer_job_with_metadata` interceptor runs after the + `post_create_transfer_job` interceptor. The (possibly modified) response returned by + `post_create_transfer_job` will be passed to + `post_create_transfer_job_with_metadata`. + """ + return response, metadata + def pre_delete_agent_pool( self, request: transfer.DeleteAgentPoolRequest, @@ -267,12 +313,35 @@ def post_get_agent_pool( ) -> transfer_types.AgentPool: """Post-rpc interceptor for get_agent_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_agent_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_get_agent_pool` interceptor runs + before the `post_get_agent_pool_with_metadata` interceptor. """ return response + def post_get_agent_pool_with_metadata( + self, + response: transfer_types.AgentPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.AgentPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_agent_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_get_agent_pool_with_metadata` + interceptor in new development instead of the `post_get_agent_pool` interceptor. + When both interceptors are used, this `post_get_agent_pool_with_metadata` interceptor runs after the + `post_get_agent_pool` interceptor. The (possibly modified) response returned by + `post_get_agent_pool` will be passed to + `post_get_agent_pool_with_metadata`. + """ + return response, metadata + def pre_get_google_service_account( self, request: transfer.GetGoogleServiceAccountRequest, @@ -292,12 +361,37 @@ def post_get_google_service_account( ) -> transfer_types.GoogleServiceAccount: """Post-rpc interceptor for get_google_service_account - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_google_service_account_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_get_google_service_account` interceptor runs + before the `post_get_google_service_account_with_metadata` interceptor. """ return response + def post_get_google_service_account_with_metadata( + self, + response: transfer_types.GoogleServiceAccount, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + transfer_types.GoogleServiceAccount, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_google_service_account + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_get_google_service_account_with_metadata` + interceptor in new development instead of the `post_get_google_service_account` interceptor. + When both interceptors are used, this `post_get_google_service_account_with_metadata` interceptor runs after the + `post_get_google_service_account` interceptor. The (possibly modified) response returned by + `post_get_google_service_account` will be passed to + `post_get_google_service_account_with_metadata`. + """ + return response, metadata + def pre_get_transfer_job( self, request: transfer.GetTransferJobRequest, @@ -315,12 +409,35 @@ def post_get_transfer_job( ) -> transfer_types.TransferJob: """Post-rpc interceptor for get_transfer_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_transfer_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_get_transfer_job` interceptor runs + before the `post_get_transfer_job_with_metadata` interceptor. """ return response + def post_get_transfer_job_with_metadata( + self, + response: transfer_types.TransferJob, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.TransferJob, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_transfer_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_get_transfer_job_with_metadata` + interceptor in new development instead of the `post_get_transfer_job` interceptor. + When both interceptors are used, this `post_get_transfer_job_with_metadata` interceptor runs after the + `post_get_transfer_job` interceptor. The (possibly modified) response returned by + `post_get_transfer_job` will be passed to + `post_get_transfer_job_with_metadata`. + """ + return response, metadata + def pre_list_agent_pools( self, request: transfer.ListAgentPoolsRequest, @@ -338,12 +455,37 @@ def post_list_agent_pools( ) -> transfer.ListAgentPoolsResponse: """Post-rpc interceptor for list_agent_pools - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_agent_pools_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_list_agent_pools` interceptor runs + before the `post_list_agent_pools_with_metadata` interceptor. """ return response + def post_list_agent_pools_with_metadata( + self, + response: transfer.ListAgentPoolsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + transfer.ListAgentPoolsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_agent_pools + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_list_agent_pools_with_metadata` + interceptor in new development instead of the `post_list_agent_pools` interceptor. + When both interceptors are used, this `post_list_agent_pools_with_metadata` interceptor runs after the + `post_list_agent_pools` interceptor. The (possibly modified) response returned by + `post_list_agent_pools` will be passed to + `post_list_agent_pools_with_metadata`. + """ + return response, metadata + def pre_list_transfer_jobs( self, request: transfer.ListTransferJobsRequest, @@ -363,12 +505,37 @@ def post_list_transfer_jobs( ) -> transfer.ListTransferJobsResponse: """Post-rpc interceptor for list_transfer_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_transfer_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_list_transfer_jobs` interceptor runs + before the `post_list_transfer_jobs_with_metadata` interceptor. """ return response + def post_list_transfer_jobs_with_metadata( + self, + response: transfer.ListTransferJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + transfer.ListTransferJobsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_transfer_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_list_transfer_jobs_with_metadata` + interceptor in new development instead of the `post_list_transfer_jobs` interceptor. + When both interceptors are used, this `post_list_transfer_jobs_with_metadata` interceptor runs after the + `post_list_transfer_jobs` interceptor. The (possibly modified) response returned by + `post_list_transfer_jobs` will be passed to + `post_list_transfer_jobs_with_metadata`. + """ + return response, metadata + def pre_pause_transfer_operation( self, request: transfer.PauseTransferOperationRequest, @@ -414,12 +581,35 @@ def post_run_transfer_job( ) -> operations_pb2.Operation: """Post-rpc interceptor for run_transfer_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_transfer_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_run_transfer_job` interceptor runs + before the `post_run_transfer_job_with_metadata` interceptor. """ return response + def post_run_transfer_job_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_transfer_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_run_transfer_job_with_metadata` + interceptor in new development instead of the `post_run_transfer_job` interceptor. + When both interceptors are used, this `post_run_transfer_job_with_metadata` interceptor runs after the + `post_run_transfer_job` interceptor. The (possibly modified) response returned by + `post_run_transfer_job` will be passed to + `post_run_transfer_job_with_metadata`. + """ + return response, metadata + def pre_update_agent_pool( self, request: transfer.UpdateAgentPoolRequest, @@ -439,12 +629,35 @@ def post_update_agent_pool( ) -> transfer_types.AgentPool: """Post-rpc interceptor for update_agent_pool - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_agent_pool_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_update_agent_pool` interceptor runs + before the `post_update_agent_pool_with_metadata` interceptor. """ return response + def post_update_agent_pool_with_metadata( + self, + response: transfer_types.AgentPool, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.AgentPool, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_agent_pool + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_update_agent_pool_with_metadata` + interceptor in new development instead of the `post_update_agent_pool` interceptor. + When both interceptors are used, this `post_update_agent_pool_with_metadata` interceptor runs after the + `post_update_agent_pool` interceptor. The (possibly modified) response returned by + `post_update_agent_pool` will be passed to + `post_update_agent_pool_with_metadata`. + """ + return response, metadata + def pre_update_transfer_job( self, request: transfer.UpdateTransferJobRequest, @@ -464,12 +677,35 @@ def post_update_transfer_job( ) -> transfer_types.TransferJob: """Post-rpc interceptor for update_transfer_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_transfer_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageTransferService server but before - it is returned to user code. + it is returned to user code. This `post_update_transfer_job` interceptor runs + before the `post_update_transfer_job_with_metadata` interceptor. """ return response + def post_update_transfer_job_with_metadata( + self, + response: transfer_types.TransferJob, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[transfer_types.TransferJob, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_transfer_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageTransferService server but before it is returned to user code. + + We recommend only using this `post_update_transfer_job_with_metadata` + interceptor in new development instead of the `post_update_transfer_job` interceptor. + When both interceptors are used, this `post_update_transfer_job_with_metadata` interceptor runs after the + `post_update_transfer_job` interceptor. The (possibly modified) response returned by + `post_update_transfer_job` will be passed to + `post_update_transfer_job_with_metadata`. + """ + return response, metadata + def pre_cancel_operation( self, request: operations_pb2.CancelOperationRequest, @@ -809,6 +1045,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_agent_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_agent_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -963,6 +1203,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_transfer_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_transfer_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1328,6 +1572,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_agent_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_agent_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1473,6 +1721,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_google_service_account(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_google_service_account_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1623,6 +1875,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_transfer_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_transfer_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1768,6 +2024,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_agent_pools(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_agent_pools_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1915,6 +2175,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_transfer_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_transfer_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2301,6 +2565,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_transfer_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_transfer_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2453,6 +2721,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_agent_pool(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_agent_pool_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2607,6 +2879,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_transfer_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_transfer_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-storage-transfer/samples/generated_samples/snippet_metadata_google.storagetransfer.v1.json b/packages/google-cloud-storage-transfer/samples/generated_samples/snippet_metadata_google.storagetransfer.v1.json index 93899fc33a97..99925243876a 100644 --- a/packages/google-cloud-storage-transfer/samples/generated_samples/snippet_metadata_google.storagetransfer.v1.json +++ b/packages/google-cloud-storage-transfer/samples/generated_samples/snippet_metadata_google.storagetransfer.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storage-transfer", - "version": "1.15.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-storage-transfer/tests/unit/gapic/storage_transfer_v1/test_storage_transfer_service.py b/packages/google-cloud-storage-transfer/tests/unit/gapic/storage_transfer_v1/test_storage_transfer_service.py index 0921ff619ea8..6bc8fd613e33 100644 --- a/packages/google-cloud-storage-transfer/tests/unit/gapic/storage_transfer_v1/test_storage_transfer_service.py +++ b/packages/google-cloud-storage-transfer/tests/unit/gapic/storage_transfer_v1/test_storage_transfer_service.py @@ -76,6 +76,13 @@ ) from google.cloud.storage_transfer_v1.types import transfer, transfer_types +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -351,6 +358,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = StorageTransferServiceClient(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 = StorageTransferServiceClient(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", [ @@ -8599,11 +8649,15 @@ def test_get_google_service_account_rest_interceptors(null_interceptor): transports.StorageTransferServiceRestInterceptor, "post_get_google_service_account", ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_get_google_service_account_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_get_google_service_account", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.GetGoogleServiceAccountRequest.pb( transfer.GetGoogleServiceAccountRequest() ) @@ -8629,6 +8683,10 @@ def test_get_google_service_account_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.GoogleServiceAccount() + post_with_metadata.return_value = ( + transfer_types.GoogleServiceAccount(), + metadata, + ) client.get_google_service_account( request, @@ -8640,6 +8698,7 @@ def test_get_google_service_account_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_transfer_job_rest_bad_request( @@ -8923,10 +8982,14 @@ def test_create_transfer_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_create_transfer_job" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_create_transfer_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_create_transfer_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.CreateTransferJobRequest.pb( transfer.CreateTransferJobRequest() ) @@ -8950,6 +9013,7 @@ def test_create_transfer_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.TransferJob() + post_with_metadata.return_value = transfer_types.TransferJob(), metadata client.create_transfer_job( request, @@ -8961,6 +9025,7 @@ def test_create_transfer_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_transfer_job_rest_bad_request( @@ -9053,10 +9118,14 @@ def test_update_transfer_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_update_transfer_job" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_update_transfer_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_update_transfer_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.UpdateTransferJobRequest.pb( transfer.UpdateTransferJobRequest() ) @@ -9080,6 +9149,7 @@ def test_update_transfer_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.TransferJob() + post_with_metadata.return_value = transfer_types.TransferJob(), metadata client.update_transfer_job( request, @@ -9091,6 +9161,7 @@ def test_update_transfer_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_transfer_job_rest_bad_request(request_type=transfer.GetTransferJobRequest): @@ -9181,10 +9252,14 @@ def test_get_transfer_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_get_transfer_job" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_get_transfer_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_get_transfer_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.GetTransferJobRequest.pb(transfer.GetTransferJobRequest()) transcode.return_value = { "method": "post", @@ -9206,6 +9281,7 @@ def test_get_transfer_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.TransferJob() + post_with_metadata.return_value = transfer_types.TransferJob(), metadata client.get_transfer_job( request, @@ -9217,6 +9293,7 @@ def test_get_transfer_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_transfer_jobs_rest_bad_request( @@ -9301,10 +9378,14 @@ def test_list_transfer_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_list_transfer_jobs" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_list_transfer_jobs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_list_transfer_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.ListTransferJobsRequest.pb( transfer.ListTransferJobsRequest() ) @@ -9330,6 +9411,7 @@ def test_list_transfer_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer.ListTransferJobsResponse() + post_with_metadata.return_value = transfer.ListTransferJobsResponse(), metadata client.list_transfer_jobs( request, @@ -9341,6 +9423,7 @@ def test_list_transfer_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_pause_transfer_operation_rest_bad_request( @@ -9638,10 +9721,14 @@ def test_run_transfer_job_rest_interceptors(null_interceptor): ), mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_run_transfer_job" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_run_transfer_job_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_run_transfer_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.RunTransferJobRequest.pb(transfer.RunTransferJobRequest()) transcode.return_value = { "method": "post", @@ -9663,6 +9750,7 @@ def test_run_transfer_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.run_transfer_job( request, @@ -9674,6 +9762,7 @@ def test_run_transfer_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_transfer_job_rest_bad_request( @@ -9944,10 +10033,14 @@ def test_create_agent_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_create_agent_pool" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_create_agent_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_create_agent_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.CreateAgentPoolRequest.pb( transfer.CreateAgentPoolRequest() ) @@ -9971,6 +10064,7 @@ def test_create_agent_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.AgentPool() + post_with_metadata.return_value = transfer_types.AgentPool(), metadata client.create_agent_pool( request, @@ -9982,6 +10076,7 @@ def test_create_agent_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_agent_pool_rest_bad_request( @@ -10143,10 +10238,14 @@ def test_update_agent_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_update_agent_pool" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_update_agent_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_update_agent_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.UpdateAgentPoolRequest.pb( transfer.UpdateAgentPoolRequest() ) @@ -10170,6 +10269,7 @@ def test_update_agent_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.AgentPool() + post_with_metadata.return_value = transfer_types.AgentPool(), metadata client.update_agent_pool( request, @@ -10181,6 +10281,7 @@ def test_update_agent_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_agent_pool_rest_bad_request(request_type=transfer.GetAgentPoolRequest): @@ -10267,10 +10368,14 @@ def test_get_agent_pool_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_get_agent_pool" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_get_agent_pool_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_get_agent_pool" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.GetAgentPoolRequest.pb(transfer.GetAgentPoolRequest()) transcode.return_value = { "method": "post", @@ -10292,6 +10397,7 @@ def test_get_agent_pool_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer_types.AgentPool() + post_with_metadata.return_value = transfer_types.AgentPool(), metadata client.get_agent_pool( request, @@ -10303,6 +10409,7 @@ def test_get_agent_pool_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_agent_pools_rest_bad_request(request_type=transfer.ListAgentPoolsRequest): @@ -10385,10 +10492,14 @@ def test_list_agent_pools_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "post_list_agent_pools" ) as post, mock.patch.object( + transports.StorageTransferServiceRestInterceptor, + "post_list_agent_pools_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageTransferServiceRestInterceptor, "pre_list_agent_pools" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = transfer.ListAgentPoolsRequest.pb(transfer.ListAgentPoolsRequest()) transcode.return_value = { "method": "post", @@ -10412,6 +10523,7 @@ def test_list_agent_pools_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = transfer.ListAgentPoolsResponse() + post_with_metadata.return_value = transfer.ListAgentPoolsResponse(), metadata client.list_agent_pools( request, @@ -10423,6 +10535,7 @@ def test_list_agent_pools_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_agent_pool_rest_bad_request( diff --git a/packages/google-cloud-storageinsights/google/cloud/storageinsights/gapic_version.py b/packages/google-cloud-storageinsights/google/cloud/storageinsights/gapic_version.py index 7daf9a1dd221..558c8aab67c5 100644 --- a/packages/google-cloud-storageinsights/google/cloud/storageinsights/gapic_version.py +++ b/packages/google-cloud-storageinsights/google/cloud/storageinsights/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/gapic_version.py b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/gapic_version.py index 7daf9a1dd221..558c8aab67c5 100644 --- a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/gapic_version.py +++ b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.13" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/client.py b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/client.py index 5e50b7d68a86..892c027a2767 100644 --- a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/client.py +++ b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -515,6 +517,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1552,16 +1581,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1607,16 +1640,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -1773,16 +1810,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -1828,16 +1869,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/transports/rest.py b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/transports/rest.py index 23202b6116e9..208e119d064e 100644 --- a/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/transports/rest.py +++ b/packages/google-cloud-storageinsights/google/cloud/storageinsights_v1/services/storage_insights/transports/rest.py @@ -149,12 +149,35 @@ def post_create_report_config( ) -> storageinsights.ReportConfig: """Post-rpc interceptor for create_report_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_report_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_create_report_config` interceptor runs + before the `post_create_report_config_with_metadata` interceptor. """ return response + def post_create_report_config_with_metadata( + self, + response: storageinsights.ReportConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[storageinsights.ReportConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_report_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_create_report_config_with_metadata` + interceptor in new development instead of the `post_create_report_config` interceptor. + When both interceptors are used, this `post_create_report_config_with_metadata` interceptor runs after the + `post_create_report_config` interceptor. The (possibly modified) response returned by + `post_create_report_config` will be passed to + `post_create_report_config_with_metadata`. + """ + return response, metadata + def pre_delete_report_config( self, request: storageinsights.DeleteReportConfigRequest, @@ -189,12 +212,35 @@ def post_get_report_config( ) -> storageinsights.ReportConfig: """Post-rpc interceptor for get_report_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_report_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_report_config` interceptor runs + before the `post_get_report_config_with_metadata` interceptor. """ return response + def post_get_report_config_with_metadata( + self, + response: storageinsights.ReportConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[storageinsights.ReportConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_report_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_get_report_config_with_metadata` + interceptor in new development instead of the `post_get_report_config` interceptor. + When both interceptors are used, this `post_get_report_config_with_metadata` interceptor runs after the + `post_get_report_config` interceptor. The (possibly modified) response returned by + `post_get_report_config` will be passed to + `post_get_report_config_with_metadata`. + """ + return response, metadata + def pre_get_report_detail( self, request: storageinsights.GetReportDetailRequest, @@ -214,12 +260,35 @@ def post_get_report_detail( ) -> storageinsights.ReportDetail: """Post-rpc interceptor for get_report_detail - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_report_detail_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_get_report_detail` interceptor runs + before the `post_get_report_detail_with_metadata` interceptor. """ return response + def post_get_report_detail_with_metadata( + self, + response: storageinsights.ReportDetail, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[storageinsights.ReportDetail, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_report_detail + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_get_report_detail_with_metadata` + interceptor in new development instead of the `post_get_report_detail` interceptor. + When both interceptors are used, this `post_get_report_detail_with_metadata` interceptor runs after the + `post_get_report_detail` interceptor. The (possibly modified) response returned by + `post_get_report_detail` will be passed to + `post_get_report_detail_with_metadata`. + """ + return response, metadata + def pre_list_report_configs( self, request: storageinsights.ListReportConfigsRequest, @@ -240,12 +309,38 @@ def post_list_report_configs( ) -> storageinsights.ListReportConfigsResponse: """Post-rpc interceptor for list_report_configs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_report_configs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_report_configs` interceptor runs + before the `post_list_report_configs_with_metadata` interceptor. """ return response + def post_list_report_configs_with_metadata( + self, + response: storageinsights.ListReportConfigsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + storageinsights.ListReportConfigsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_report_configs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_list_report_configs_with_metadata` + interceptor in new development instead of the `post_list_report_configs` interceptor. + When both interceptors are used, this `post_list_report_configs_with_metadata` interceptor runs after the + `post_list_report_configs` interceptor. The (possibly modified) response returned by + `post_list_report_configs` will be passed to + `post_list_report_configs_with_metadata`. + """ + return response, metadata + def pre_list_report_details( self, request: storageinsights.ListReportDetailsRequest, @@ -266,12 +361,38 @@ def post_list_report_details( ) -> storageinsights.ListReportDetailsResponse: """Post-rpc interceptor for list_report_details - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_report_details_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_list_report_details` interceptor runs + before the `post_list_report_details_with_metadata` interceptor. """ return response + def post_list_report_details_with_metadata( + self, + response: storageinsights.ListReportDetailsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + storageinsights.ListReportDetailsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_report_details + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_list_report_details_with_metadata` + interceptor in new development instead of the `post_list_report_details` interceptor. + When both interceptors are used, this `post_list_report_details_with_metadata` interceptor runs after the + `post_list_report_details` interceptor. The (possibly modified) response returned by + `post_list_report_details` will be passed to + `post_list_report_details_with_metadata`. + """ + return response, metadata + def pre_update_report_config( self, request: storageinsights.UpdateReportConfigRequest, @@ -292,12 +413,35 @@ def post_update_report_config( ) -> storageinsights.ReportConfig: """Post-rpc interceptor for update_report_config - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_report_config_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the StorageInsights server but before - it is returned to user code. + it is returned to user code. This `post_update_report_config` interceptor runs + before the `post_update_report_config_with_metadata` interceptor. """ return response + def post_update_report_config_with_metadata( + self, + response: storageinsights.ReportConfig, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[storageinsights.ReportConfig, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_report_config + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the StorageInsights server but before it is returned to user code. + + We recommend only using this `post_update_report_config_with_metadata` + interceptor in new development instead of the `post_update_report_config` interceptor. + When both interceptors are used, this `post_update_report_config_with_metadata` interceptor runs after the + `post_update_report_config` interceptor. The (possibly modified) response returned by + `post_update_report_config` will be passed to + `post_update_report_config_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -663,6 +807,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_report_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_report_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -920,6 +1068,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_report_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_report_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1066,6 +1218,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_report_detail(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_report_detail_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1212,6 +1368,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_report_configs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_report_configs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1360,6 +1520,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_report_details(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_report_details_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1517,6 +1681,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_report_config(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_report_config_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-storageinsights/samples/generated_samples/snippet_metadata_google.cloud.storageinsights.v1.json b/packages/google-cloud-storageinsights/samples/generated_samples/snippet_metadata_google.cloud.storageinsights.v1.json index e14969536de7..3852bb62c126 100644 --- a/packages/google-cloud-storageinsights/samples/generated_samples/snippet_metadata_google.cloud.storageinsights.v1.json +++ b/packages/google-cloud-storageinsights/samples/generated_samples/snippet_metadata_google.cloud.storageinsights.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-storageinsights", - "version": "0.1.13" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-storageinsights/tests/unit/gapic/storageinsights_v1/test_storage_insights.py b/packages/google-cloud-storageinsights/tests/unit/gapic/storageinsights_v1/test_storage_insights.py index 96e98ca7624f..0e5170a33bc6 100644 --- a/packages/google-cloud-storageinsights/tests/unit/gapic/storageinsights_v1/test_storage_insights.py +++ b/packages/google-cloud-storageinsights/tests/unit/gapic/storageinsights_v1/test_storage_insights.py @@ -67,6 +67,13 @@ ) from google.cloud.storageinsights_v1.types import storageinsights +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -325,6 +332,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 = StorageInsightsClient(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 = StorageInsightsClient(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", [ @@ -6002,10 +6052,14 @@ def test_list_report_configs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_list_report_configs" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_list_report_configs_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_list_report_configs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.ListReportConfigsRequest.pb( storageinsights.ListReportConfigsRequest() ) @@ -6031,6 +6085,10 @@ def test_list_report_configs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ListReportConfigsResponse() + post_with_metadata.return_value = ( + storageinsights.ListReportConfigsResponse(), + metadata, + ) client.list_report_configs( request, @@ -6042,6 +6100,7 @@ def test_list_report_configs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_report_config_rest_bad_request( @@ -6128,10 +6187,14 @@ def test_get_report_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_get_report_config" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_get_report_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_get_report_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.GetReportConfigRequest.pb( storageinsights.GetReportConfigRequest() ) @@ -6157,6 +6220,7 @@ def test_get_report_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ReportConfig() + post_with_metadata.return_value = storageinsights.ReportConfig(), metadata client.get_report_config( request, @@ -6168,6 +6232,7 @@ def test_get_report_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_report_config_rest_bad_request( @@ -6347,10 +6412,14 @@ def test_create_report_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_create_report_config" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_create_report_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_create_report_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.CreateReportConfigRequest.pb( storageinsights.CreateReportConfigRequest() ) @@ -6376,6 +6445,7 @@ def test_create_report_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ReportConfig() + post_with_metadata.return_value = storageinsights.ReportConfig(), metadata client.create_report_config( request, @@ -6387,6 +6457,7 @@ def test_create_report_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_report_config_rest_bad_request( @@ -6574,10 +6645,14 @@ def test_update_report_config_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_update_report_config" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_update_report_config_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_update_report_config" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.UpdateReportConfigRequest.pb( storageinsights.UpdateReportConfigRequest() ) @@ -6603,6 +6678,7 @@ def test_update_report_config_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ReportConfig() + post_with_metadata.return_value = storageinsights.ReportConfig(), metadata client.update_report_config( request, @@ -6614,6 +6690,7 @@ def test_update_report_config_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_report_config_rest_bad_request( @@ -6813,10 +6890,14 @@ def test_list_report_details_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_list_report_details" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_list_report_details_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_list_report_details" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.ListReportDetailsRequest.pb( storageinsights.ListReportDetailsRequest() ) @@ -6842,6 +6923,10 @@ def test_list_report_details_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ListReportDetailsResponse() + post_with_metadata.return_value = ( + storageinsights.ListReportDetailsResponse(), + metadata, + ) client.list_report_details( request, @@ -6853,6 +6938,7 @@ def test_list_report_details_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_report_detail_rest_bad_request( @@ -6945,10 +7031,14 @@ def test_get_report_detail_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.StorageInsightsRestInterceptor, "post_get_report_detail" ) as post, mock.patch.object( + transports.StorageInsightsRestInterceptor, + "post_get_report_detail_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.StorageInsightsRestInterceptor, "pre_get_report_detail" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = storageinsights.GetReportDetailRequest.pb( storageinsights.GetReportDetailRequest() ) @@ -6974,6 +7064,7 @@ def test_get_report_detail_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = storageinsights.ReportDetail() + post_with_metadata.return_value = storageinsights.ReportDetail(), metadata client.get_report_detail( request, @@ -6985,6 +7076,7 @@ def test_get_report_detail_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-support/google/cloud/support/gapic_version.py b/packages/google-cloud-support/google/cloud/support/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-cloud-support/google/cloud/support/gapic_version.py +++ b/packages/google-cloud-support/google/cloud/support/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-support/google/cloud/support_v2/gapic_version.py b/packages/google-cloud-support/google/cloud/support_v2/gapic_version.py index 17bbab4c1877..558c8aab67c5 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/gapic_version.py +++ b/packages/google-cloud-support/google/cloud/support_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.1.12" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/client.py b/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/client.py index e7968dbc8d6e..7c08b23fdd86 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/client.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -505,6 +507,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-support/google/cloud/support_v2/services/case_attachment_service/transports/rest.py b/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/transports/rest.py index 3bb0550c6fe9..956ea88403ff 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/transports/rest.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/case_attachment_service/transports/rest.py @@ -102,12 +102,38 @@ def post_list_attachments( ) -> attachment_service.ListAttachmentsResponse: """Post-rpc interceptor for list_attachments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_attachments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseAttachmentService server but before - it is returned to user code. + it is returned to user code. This `post_list_attachments` interceptor runs + before the `post_list_attachments_with_metadata` interceptor. """ return response + def post_list_attachments_with_metadata( + self, + response: attachment_service.ListAttachmentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + attachment_service.ListAttachmentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_attachments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseAttachmentService server but before it is returned to user code. + + We recommend only using this `post_list_attachments_with_metadata` + interceptor in new development instead of the `post_list_attachments` interceptor. + When both interceptors are used, this `post_list_attachments_with_metadata` interceptor runs after the + `post_list_attachments` interceptor. The (possibly modified) response returned by + `post_list_attachments` will be passed to + `post_list_attachments_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CaseAttachmentServiceRestStub: @@ -321,6 +347,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_attachments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_attachments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-support/google/cloud/support_v2/services/case_service/client.py b/packages/google-cloud-support/google/cloud/support_v2/services/case_service/client.py index e65a7f2d32fe..8d9dacacb3fc 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/case_service/client.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/case_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -483,6 +485,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-support/google/cloud/support_v2/services/case_service/transports/rest.py b/packages/google-cloud-support/google/cloud/support_v2/services/case_service/transports/rest.py index 17896bc70dce..5395f82e24d0 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/case_service/transports/rest.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/case_service/transports/rest.py @@ -155,12 +155,33 @@ def pre_close_case( def post_close_case(self, response: case.Case) -> case.Case: """Post-rpc interceptor for close_case - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_close_case_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_close_case` interceptor runs + before the `post_close_case_with_metadata` interceptor. """ return response + def post_close_case_with_metadata( + self, response: case.Case, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[case.Case, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for close_case + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_close_case_with_metadata` + interceptor in new development instead of the `post_close_case` interceptor. + When both interceptors are used, this `post_close_case_with_metadata` interceptor runs after the + `post_close_case` interceptor. The (possibly modified) response returned by + `post_close_case` will be passed to + `post_close_case_with_metadata`. + """ + return response, metadata + def pre_create_case( self, request: case_service.CreateCaseRequest, @@ -176,12 +197,33 @@ def pre_create_case( def post_create_case(self, response: gcs_case.Case) -> gcs_case.Case: """Post-rpc interceptor for create_case - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_case_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_create_case` interceptor runs + before the `post_create_case_with_metadata` interceptor. """ return response + def post_create_case_with_metadata( + self, response: gcs_case.Case, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gcs_case.Case, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_case + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_create_case_with_metadata` + interceptor in new development instead of the `post_create_case` interceptor. + When both interceptors are used, this `post_create_case_with_metadata` interceptor runs after the + `post_create_case` interceptor. The (possibly modified) response returned by + `post_create_case` will be passed to + `post_create_case_with_metadata`. + """ + return response, metadata + def pre_escalate_case( self, request: case_service.EscalateCaseRequest, @@ -199,12 +241,33 @@ def pre_escalate_case( def post_escalate_case(self, response: case.Case) -> case.Case: """Post-rpc interceptor for escalate_case - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_escalate_case_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_escalate_case` interceptor runs + before the `post_escalate_case_with_metadata` interceptor. """ return response + def post_escalate_case_with_metadata( + self, response: case.Case, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[case.Case, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for escalate_case + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_escalate_case_with_metadata` + interceptor in new development instead of the `post_escalate_case` interceptor. + When both interceptors are used, this `post_escalate_case_with_metadata` interceptor runs after the + `post_escalate_case` interceptor. The (possibly modified) response returned by + `post_escalate_case` will be passed to + `post_escalate_case_with_metadata`. + """ + return response, metadata + def pre_get_case( self, request: case_service.GetCaseRequest, @@ -220,12 +283,33 @@ def pre_get_case( def post_get_case(self, response: case.Case) -> case.Case: """Post-rpc interceptor for get_case - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_case_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_get_case` interceptor runs + before the `post_get_case_with_metadata` interceptor. """ return response + def post_get_case_with_metadata( + self, response: case.Case, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[case.Case, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_case + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_get_case_with_metadata` + interceptor in new development instead of the `post_get_case` interceptor. + When both interceptors are used, this `post_get_case_with_metadata` interceptor runs after the + `post_get_case` interceptor. The (possibly modified) response returned by + `post_get_case` will be passed to + `post_get_case_with_metadata`. + """ + return response, metadata + def pre_list_cases( self, request: case_service.ListCasesRequest, @@ -243,12 +327,35 @@ def post_list_cases( ) -> case_service.ListCasesResponse: """Post-rpc interceptor for list_cases - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_cases_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_list_cases` interceptor runs + before the `post_list_cases_with_metadata` interceptor. """ return response + def post_list_cases_with_metadata( + self, + response: case_service.ListCasesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[case_service.ListCasesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_cases + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_list_cases_with_metadata` + interceptor in new development instead of the `post_list_cases` interceptor. + When both interceptors are used, this `post_list_cases_with_metadata` interceptor runs after the + `post_list_cases` interceptor. The (possibly modified) response returned by + `post_list_cases` will be passed to + `post_list_cases_with_metadata`. + """ + return response, metadata + def pre_search_case_classifications( self, request: case_service.SearchCaseClassificationsRequest, @@ -269,12 +376,38 @@ def post_search_case_classifications( ) -> case_service.SearchCaseClassificationsResponse: """Post-rpc interceptor for search_case_classifications - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_case_classifications_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_search_case_classifications` interceptor runs + before the `post_search_case_classifications_with_metadata` interceptor. """ return response + def post_search_case_classifications_with_metadata( + self, + response: case_service.SearchCaseClassificationsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + case_service.SearchCaseClassificationsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_case_classifications + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_search_case_classifications_with_metadata` + interceptor in new development instead of the `post_search_case_classifications` interceptor. + When both interceptors are used, this `post_search_case_classifications_with_metadata` interceptor runs after the + `post_search_case_classifications` interceptor. The (possibly modified) response returned by + `post_search_case_classifications` will be passed to + `post_search_case_classifications_with_metadata`. + """ + return response, metadata + def pre_search_cases( self, request: case_service.SearchCasesRequest, @@ -294,12 +427,37 @@ def post_search_cases( ) -> case_service.SearchCasesResponse: """Post-rpc interceptor for search_cases - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_cases_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_search_cases` interceptor runs + before the `post_search_cases_with_metadata` interceptor. """ return response + def post_search_cases_with_metadata( + self, + response: case_service.SearchCasesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + case_service.SearchCasesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for search_cases + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_search_cases_with_metadata` + interceptor in new development instead of the `post_search_cases` interceptor. + When both interceptors are used, this `post_search_cases_with_metadata` interceptor runs after the + `post_search_cases` interceptor. The (possibly modified) response returned by + `post_search_cases` will be passed to + `post_search_cases_with_metadata`. + """ + return response, metadata + def pre_update_case( self, request: case_service.UpdateCaseRequest, @@ -315,12 +473,33 @@ def pre_update_case( def post_update_case(self, response: gcs_case.Case) -> gcs_case.Case: """Post-rpc interceptor for update_case - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_case_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CaseService server but before - it is returned to user code. + it is returned to user code. This `post_update_case` interceptor runs + before the `post_update_case_with_metadata` interceptor. """ return response + def post_update_case_with_metadata( + self, response: gcs_case.Case, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gcs_case.Case, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_case + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CaseService server but before it is returned to user code. + + We recommend only using this `post_update_case_with_metadata` + interceptor in new development instead of the `post_update_case` interceptor. + When both interceptors are used, this `post_update_case_with_metadata` interceptor runs after the + `post_update_case` interceptor. The (possibly modified) response returned by + `post_update_case` will be passed to + `post_update_case_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CaseServiceRestStub: @@ -534,6 +713,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_close_case(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_close_case_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -685,6 +868,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_case(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_case_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -838,6 +1025,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_escalate_case(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_escalate_case_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -981,6 +1172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_case(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_case_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1126,6 +1321,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_cases(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_cases_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1275,6 +1474,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_case_classifications(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_case_classifications_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1424,6 +1627,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_cases(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_cases_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1577,6 +1784,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_case(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_case_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/client.py b/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/client.py index af614117b3ec..7d0934a3ef99 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/client.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -506,6 +508,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. diff --git a/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/transports/rest.py b/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/transports/rest.py index d7baf5eb80a4..3295c3e40bc0 100644 --- a/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/transports/rest.py +++ b/packages/google-cloud-support/google/cloud/support_v2/services/comment_service/transports/rest.py @@ -108,12 +108,35 @@ def pre_create_comment( def post_create_comment(self, response: gcs_comment.Comment) -> gcs_comment.Comment: """Post-rpc interceptor for create_comment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_comment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CommentService server but before - it is returned to user code. + it is returned to user code. This `post_create_comment` interceptor runs + before the `post_create_comment_with_metadata` interceptor. """ return response + def post_create_comment_with_metadata( + self, + response: gcs_comment.Comment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gcs_comment.Comment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_comment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CommentService server but before it is returned to user code. + + We recommend only using this `post_create_comment_with_metadata` + interceptor in new development instead of the `post_create_comment` interceptor. + When both interceptors are used, this `post_create_comment_with_metadata` interceptor runs after the + `post_create_comment` interceptor. The (possibly modified) response returned by + `post_create_comment` will be passed to + `post_create_comment_with_metadata`. + """ + return response, metadata + def pre_list_comments( self, request: comment_service.ListCommentsRequest, @@ -133,12 +156,37 @@ def post_list_comments( ) -> comment_service.ListCommentsResponse: """Post-rpc interceptor for list_comments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_comments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CommentService server but before - it is returned to user code. + it is returned to user code. This `post_list_comments` interceptor runs + before the `post_list_comments_with_metadata` interceptor. """ return response + def post_list_comments_with_metadata( + self, + response: comment_service.ListCommentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + comment_service.ListCommentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_comments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CommentService server but before it is returned to user code. + + We recommend only using this `post_list_comments_with_metadata` + interceptor in new development instead of the `post_list_comments` interceptor. + When both interceptors are used, this `post_list_comments_with_metadata` interceptor runs after the + `post_list_comments` interceptor. The (possibly modified) response returned by + `post_list_comments` will be passed to + `post_list_comments_with_metadata`. + """ + return response, metadata + @dataclasses.dataclass class CommentServiceRestStub: @@ -352,6 +400,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_comment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_comment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -495,6 +547,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_comments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_comments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-support/samples/generated_samples/snippet_metadata_google.cloud.support.v2.json b/packages/google-cloud-support/samples/generated_samples/snippet_metadata_google.cloud.support.v2.json index 0bff641e1258..0e2ed2a1f18f 100644 --- a/packages/google-cloud-support/samples/generated_samples/snippet_metadata_google.cloud.support.v2.json +++ b/packages/google-cloud-support/samples/generated_samples/snippet_metadata_google.cloud.support.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-support", - "version": "0.1.12" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_attachment_service.py b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_attachment_service.py index 2ca6bc4f4560..2be4e022f572 100644 --- a/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_attachment_service.py +++ b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_attachment_service.py @@ -60,6 +60,13 @@ ) from google.cloud.support_v2.types import attachment, attachment_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = CaseAttachmentServiceClient(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 = CaseAttachmentServiceClient(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", [ @@ -2158,10 +2208,14 @@ def test_list_attachments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseAttachmentServiceRestInterceptor, "post_list_attachments" ) as post, mock.patch.object( + transports.CaseAttachmentServiceRestInterceptor, + "post_list_attachments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CaseAttachmentServiceRestInterceptor, "pre_list_attachments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = attachment_service.ListAttachmentsRequest.pb( attachment_service.ListAttachmentsRequest() ) @@ -2187,6 +2241,10 @@ def test_list_attachments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = attachment_service.ListAttachmentsResponse() + post_with_metadata.return_value = ( + attachment_service.ListAttachmentsResponse(), + metadata, + ) client.list_attachments( request, @@ -2198,6 +2256,7 @@ def test_list_attachments_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-support/tests/unit/gapic/support_v2/test_case_service.py b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_service.py index be2dc8ce045f..83a59fd34a81 100644 --- a/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_service.py +++ b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_case_service.py @@ -65,6 +65,13 @@ from google.cloud.support_v2.types import case as gcs_case from google.cloud.support_v2.types import case_service, escalation +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 = CaseServiceClient(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 = CaseServiceClient(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", [ @@ -5919,10 +5969,13 @@ def test_get_case_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_get_case" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_get_case_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_get_case" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.GetCaseRequest.pb(case_service.GetCaseRequest()) transcode.return_value = { "method": "post", @@ -5944,6 +5997,7 @@ def test_get_case_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case.Case() + post_with_metadata.return_value = case.Case(), metadata client.get_case( request, @@ -5955,6 +6009,7 @@ def test_get_case_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_cases_rest_bad_request(request_type=case_service.ListCasesRequest): @@ -6037,10 +6092,13 @@ def test_list_cases_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_list_cases" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_list_cases_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_list_cases" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.ListCasesRequest.pb(case_service.ListCasesRequest()) transcode.return_value = { "method": "post", @@ -6064,6 +6122,7 @@ def test_list_cases_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case_service.ListCasesResponse() + post_with_metadata.return_value = case_service.ListCasesResponse(), metadata client.list_cases( request, @@ -6075,6 +6134,7 @@ def test_list_cases_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_cases_rest_bad_request(request_type=case_service.SearchCasesRequest): @@ -6157,10 +6217,13 @@ def test_search_cases_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_search_cases" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_search_cases_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_search_cases" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.SearchCasesRequest.pb( case_service.SearchCasesRequest() ) @@ -6186,6 +6249,7 @@ def test_search_cases_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case_service.SearchCasesResponse() + post_with_metadata.return_value = case_service.SearchCasesResponse(), metadata client.search_cases( request, @@ -6197,6 +6261,7 @@ def test_search_cases_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_case_rest_bad_request(request_type=case_service.CreateCaseRequest): @@ -6390,10 +6455,13 @@ def test_create_case_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_create_case" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_create_case_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_create_case" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.CreateCaseRequest.pb(case_service.CreateCaseRequest()) transcode.return_value = { "method": "post", @@ -6415,6 +6483,7 @@ def test_create_case_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_case.Case() + post_with_metadata.return_value = gcs_case.Case(), metadata client.create_case( request, @@ -6426,6 +6495,7 @@ def test_create_case_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_case_rest_bad_request(request_type=case_service.UpdateCaseRequest): @@ -6619,10 +6689,13 @@ def test_update_case_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_update_case" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_update_case_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_update_case" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.UpdateCaseRequest.pb(case_service.UpdateCaseRequest()) transcode.return_value = { "method": "post", @@ -6644,6 +6717,7 @@ def test_update_case_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_case.Case() + post_with_metadata.return_value = gcs_case.Case(), metadata client.update_case( request, @@ -6655,6 +6729,7 @@ def test_update_case_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_escalate_case_rest_bad_request(request_type=case_service.EscalateCaseRequest): @@ -6757,10 +6832,13 @@ def test_escalate_case_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_escalate_case" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_escalate_case_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_escalate_case" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.EscalateCaseRequest.pb( case_service.EscalateCaseRequest() ) @@ -6784,6 +6862,7 @@ def test_escalate_case_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case.Case() + post_with_metadata.return_value = case.Case(), metadata client.escalate_case( request, @@ -6795,6 +6874,7 @@ def test_escalate_case_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_close_case_rest_bad_request(request_type=case_service.CloseCaseRequest): @@ -6897,10 +6977,13 @@ def test_close_case_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_close_case" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, "post_close_case_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_close_case" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.CloseCaseRequest.pb(case_service.CloseCaseRequest()) transcode.return_value = { "method": "post", @@ -6922,6 +7005,7 @@ def test_close_case_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case.Case() + post_with_metadata.return_value = case.Case(), metadata client.close_case( request, @@ -6933,6 +7017,7 @@ def test_close_case_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_case_classifications_rest_bad_request( @@ -7017,10 +7102,14 @@ def test_search_case_classifications_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CaseServiceRestInterceptor, "post_search_case_classifications" ) as post, mock.patch.object( + transports.CaseServiceRestInterceptor, + "post_search_case_classifications_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.CaseServiceRestInterceptor, "pre_search_case_classifications" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = case_service.SearchCaseClassificationsRequest.pb( case_service.SearchCaseClassificationsRequest() ) @@ -7046,6 +7135,10 @@ def test_search_case_classifications_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = case_service.SearchCaseClassificationsResponse() + post_with_metadata.return_value = ( + case_service.SearchCaseClassificationsResponse(), + metadata, + ) client.search_case_classifications( request, @@ -7057,6 +7150,7 @@ def test_search_case_classifications_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-support/tests/unit/gapic/support_v2/test_comment_service.py b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_comment_service.py index 79f9072b3ce4..bf2f32a4f0ab 100644 --- a/packages/google-cloud-support/tests/unit/gapic/support_v2/test_comment_service.py +++ b/packages/google-cloud-support/tests/unit/gapic/support_v2/test_comment_service.py @@ -64,6 +64,13 @@ from google.cloud.support_v2.types import comment as gcs_comment from google.cloud.support_v2.types import comment_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -322,6 +329,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 = CommentServiceClient(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 = CommentServiceClient(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", [ @@ -2670,10 +2720,13 @@ def test_list_comments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CommentServiceRestInterceptor, "post_list_comments" ) as post, mock.patch.object( + transports.CommentServiceRestInterceptor, "post_list_comments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CommentServiceRestInterceptor, "pre_list_comments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = comment_service.ListCommentsRequest.pb( comment_service.ListCommentsRequest() ) @@ -2699,6 +2752,10 @@ def test_list_comments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = comment_service.ListCommentsResponse() + post_with_metadata.return_value = ( + comment_service.ListCommentsResponse(), + metadata, + ) client.list_comments( request, @@ -2710,6 +2767,7 @@ def test_list_comments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_comment_rest_bad_request( @@ -2876,10 +2934,13 @@ def test_create_comment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CommentServiceRestInterceptor, "post_create_comment" ) as post, mock.patch.object( + transports.CommentServiceRestInterceptor, "post_create_comment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CommentServiceRestInterceptor, "pre_create_comment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = comment_service.CreateCommentRequest.pb( comment_service.CreateCommentRequest() ) @@ -2903,6 +2964,7 @@ def test_create_comment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gcs_comment.Comment() + post_with_metadata.return_value = gcs_comment.Comment(), metadata client.create_comment( request, @@ -2914,6 +2976,7 @@ def test_create_comment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_initialize_client_w_rest(): diff --git a/packages/google-cloud-talent/google/cloud/talent/gapic_version.py b/packages/google-cloud-talent/google/cloud/talent/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-talent/google/cloud/talent/gapic_version.py +++ b/packages/google-cloud-talent/google/cloud/talent/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/gapic_version.py b/packages/google-cloud-talent/google/cloud/talent_v4/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/gapic_version.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/client.py index 69cd7fd60bbc..cf274cf256a6 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -509,6 +511,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1359,16 +1388,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/transports/rest.py index b29794aa8172..bf6b108dc770 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/company_service/transports/rest.py @@ -131,12 +131,35 @@ def pre_create_company( def post_create_company(self, response: gct_company.Company) -> gct_company.Company: """Post-rpc interceptor for create_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_create_company` interceptor runs + before the `post_create_company_with_metadata` interceptor. """ return response + def post_create_company_with_metadata( + self, + response: gct_company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_create_company_with_metadata` + interceptor in new development instead of the `post_create_company` interceptor. + When both interceptors are used, this `post_create_company_with_metadata` interceptor runs after the + `post_create_company` interceptor. The (possibly modified) response returned by + `post_create_company` will be passed to + `post_create_company_with_metadata`. + """ + return response, metadata + def pre_delete_company( self, request: company_service.DeleteCompanyRequest, @@ -168,12 +191,35 @@ def pre_get_company( def post_get_company(self, response: company.Company) -> company.Company: """Post-rpc interceptor for get_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_get_company` interceptor runs + before the `post_get_company_with_metadata` interceptor. """ return response + def post_get_company_with_metadata( + self, + response: company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_get_company_with_metadata` + interceptor in new development instead of the `post_get_company` interceptor. + When both interceptors are used, this `post_get_company_with_metadata` interceptor runs after the + `post_get_company` interceptor. The (possibly modified) response returned by + `post_get_company` will be passed to + `post_get_company_with_metadata`. + """ + return response, metadata + def pre_list_companies( self, request: company_service.ListCompaniesRequest, @@ -193,12 +239,37 @@ def post_list_companies( ) -> company_service.ListCompaniesResponse: """Post-rpc interceptor for list_companies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_companies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_list_companies` interceptor runs + before the `post_list_companies_with_metadata` interceptor. """ return response + def post_list_companies_with_metadata( + self, + response: company_service.ListCompaniesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + company_service.ListCompaniesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_companies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_list_companies_with_metadata` + interceptor in new development instead of the `post_list_companies` interceptor. + When both interceptors are used, this `post_list_companies_with_metadata` interceptor runs after the + `post_list_companies` interceptor. The (possibly modified) response returned by + `post_list_companies` will be passed to + `post_list_companies_with_metadata`. + """ + return response, metadata + def pre_update_company( self, request: company_service.UpdateCompanyRequest, @@ -216,12 +287,35 @@ def pre_update_company( def post_update_company(self, response: gct_company.Company) -> gct_company.Company: """Post-rpc interceptor for update_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_update_company` interceptor runs + before the `post_update_company_with_metadata` interceptor. """ return response + def post_update_company_with_metadata( + self, + response: gct_company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_update_company_with_metadata` + interceptor in new development instead of the `post_update_company` interceptor. + When both interceptors are used, this `post_update_company_with_metadata` interceptor runs after the + `post_update_company` interceptor. The (possibly modified) response returned by + `post_update_company` will be passed to + `post_update_company_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -465,6 +559,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -720,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -861,6 +963,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_companies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_companies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1016,6 +1122,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/client.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/client.py index 0ba561b4687e..43860d528c52 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/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 @@ -500,6 +502,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. @@ -835,16 +864,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/transports/rest.py index aa27f8d55749..89790d281a70 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/completion/transports/rest.py @@ -102,12 +102,38 @@ def post_complete_query( ) -> completion_service.CompleteQueryResponse: """Post-rpc interceptor for complete_query - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_complete_query_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Completion server but before - it is returned to user code. + it is returned to user code. This `post_complete_query` interceptor runs + before the `post_complete_query_with_metadata` interceptor. """ return response + def post_complete_query_with_metadata( + self, + response: completion_service.CompleteQueryResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + completion_service.CompleteQueryResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for complete_query + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Completion server but before it is returned to user code. + + We recommend only using this `post_complete_query_with_metadata` + interceptor in new development instead of the `post_complete_query` interceptor. + When both interceptors are used, this `post_complete_query_with_metadata` interceptor runs after the + `post_complete_query` interceptor. The (possibly modified) response returned by + `post_complete_query` will be passed to + `post_complete_query_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -341,6 +367,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_complete_query(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_complete_query_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/client.py index 52a1164f117f..8e20db1b49ce 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -479,6 +481,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -868,16 +897,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/transports/rest.py index a8ad1e32e44a..5f177f4a50b5 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/event_service/transports/rest.py @@ -102,12 +102,35 @@ def post_create_client_event( ) -> event.ClientEvent: """Post-rpc interceptor for create_client_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_client_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EventService server but before - it is returned to user code. + it is returned to user code. This `post_create_client_event` interceptor runs + before the `post_create_client_event_with_metadata` interceptor. """ return response + def post_create_client_event_with_metadata( + self, + response: event.ClientEvent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[event.ClientEvent, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_client_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EventService server but before it is returned to user code. + + We recommend only using this `post_create_client_event_with_metadata` + interceptor in new development instead of the `post_create_client_event` interceptor. + When both interceptors are used, this `post_create_client_event_with_metadata` interceptor runs after the + `post_create_client_event` interceptor. The (possibly modified) response returned by + `post_create_client_event` will be passed to + `post_create_client_event_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -355,6 +378,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_client_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_client_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/client.py index e9eec7f70c9c..c68a72103d57 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -532,6 +534,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2019,16 +2048,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/transports/rest.py index 9b90138178f1..139c1773ceb7 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/job_service/transports/rest.py @@ -173,12 +173,35 @@ def post_batch_create_jobs( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_jobs` interceptor runs + before the `post_batch_create_jobs_with_metadata` interceptor. """ return response + def post_batch_create_jobs_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_create_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_batch_create_jobs_with_metadata` + interceptor in new development instead of the `post_batch_create_jobs` interceptor. + When both interceptors are used, this `post_batch_create_jobs_with_metadata` interceptor runs after the + `post_batch_create_jobs` interceptor. The (possibly modified) response returned by + `post_batch_create_jobs` will be passed to + `post_batch_create_jobs_with_metadata`. + """ + return response, metadata + def pre_batch_delete_jobs( self, request: job_service.BatchDeleteJobsRequest, @@ -198,12 +221,35 @@ def post_batch_delete_jobs( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_delete_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_delete_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_batch_delete_jobs` interceptor runs + before the `post_batch_delete_jobs_with_metadata` interceptor. """ return response + def post_batch_delete_jobs_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_delete_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_batch_delete_jobs_with_metadata` + interceptor in new development instead of the `post_batch_delete_jobs` interceptor. + When both interceptors are used, this `post_batch_delete_jobs_with_metadata` interceptor runs after the + `post_batch_delete_jobs` interceptor. The (possibly modified) response returned by + `post_batch_delete_jobs` will be passed to + `post_batch_delete_jobs_with_metadata`. + """ + return response, metadata + def pre_batch_update_jobs( self, request: job_service.BatchUpdateJobsRequest, @@ -223,12 +269,35 @@ def post_batch_update_jobs( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_update_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_jobs` interceptor runs + before the `post_batch_update_jobs_with_metadata` interceptor. """ return response + def post_batch_update_jobs_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_update_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_batch_update_jobs_with_metadata` + interceptor in new development instead of the `post_batch_update_jobs` interceptor. + When both interceptors are used, this `post_batch_update_jobs_with_metadata` interceptor runs after the + `post_batch_update_jobs` interceptor. The (possibly modified) response returned by + `post_batch_update_jobs` will be passed to + `post_batch_update_jobs_with_metadata`. + """ + return response, metadata + def pre_create_job( self, request: job_service.CreateJobRequest, @@ -244,12 +313,33 @@ def pre_create_job( def post_create_job(self, response: gct_job.Job) -> gct_job.Job: """Post-rpc interceptor for create_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_create_job` interceptor runs + before the `post_create_job_with_metadata` interceptor. """ return response + def post_create_job_with_metadata( + self, response: gct_job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_create_job_with_metadata` + interceptor in new development instead of the `post_create_job` interceptor. + When both interceptors are used, this `post_create_job_with_metadata` interceptor runs after the + `post_create_job` interceptor. The (possibly modified) response returned by + `post_create_job` will be passed to + `post_create_job_with_metadata`. + """ + return response, metadata + def pre_delete_job( self, request: job_service.DeleteJobRequest, @@ -277,12 +367,33 @@ def pre_get_job( def post_get_job(self, response: job.Job) -> job.Job: """Post-rpc interceptor for get_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_get_job` interceptor runs + before the `post_get_job_with_metadata` interceptor. """ return response + def post_get_job_with_metadata( + self, response: job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_get_job_with_metadata` + interceptor in new development instead of the `post_get_job` interceptor. + When both interceptors are used, this `post_get_job_with_metadata` interceptor runs after the + `post_get_job` interceptor. The (possibly modified) response returned by + `post_get_job` will be passed to + `post_get_job_with_metadata`. + """ + return response, metadata + def pre_list_jobs( self, request: job_service.ListJobsRequest, @@ -300,12 +411,35 @@ def post_list_jobs( ) -> job_service.ListJobsResponse: """Post-rpc interceptor for list_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_list_jobs` interceptor runs + before the `post_list_jobs_with_metadata` interceptor. """ return response + def post_list_jobs_with_metadata( + self, + response: job_service.ListJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.ListJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_list_jobs_with_metadata` + interceptor in new development instead of the `post_list_jobs` interceptor. + When both interceptors are used, this `post_list_jobs_with_metadata` interceptor runs after the + `post_list_jobs` interceptor. The (possibly modified) response returned by + `post_list_jobs` will be passed to + `post_list_jobs_with_metadata`. + """ + return response, metadata + def pre_search_jobs( self, request: job_service.SearchJobsRequest, @@ -323,12 +457,35 @@ def post_search_jobs( ) -> job_service.SearchJobsResponse: """Post-rpc interceptor for search_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_search_jobs` interceptor runs + before the `post_search_jobs_with_metadata` interceptor. """ return response + def post_search_jobs_with_metadata( + self, + response: job_service.SearchJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.SearchJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_search_jobs_with_metadata` + interceptor in new development instead of the `post_search_jobs` interceptor. + When both interceptors are used, this `post_search_jobs_with_metadata` interceptor runs after the + `post_search_jobs` interceptor. The (possibly modified) response returned by + `post_search_jobs` will be passed to + `post_search_jobs_with_metadata`. + """ + return response, metadata + def pre_search_jobs_for_alert( self, request: job_service.SearchJobsRequest, @@ -346,12 +503,35 @@ def post_search_jobs_for_alert( ) -> job_service.SearchJobsResponse: """Post-rpc interceptor for search_jobs_for_alert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_jobs_for_alert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_search_jobs_for_alert` interceptor runs + before the `post_search_jobs_for_alert_with_metadata` interceptor. """ return response + def post_search_jobs_for_alert_with_metadata( + self, + response: job_service.SearchJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.SearchJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_jobs_for_alert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_search_jobs_for_alert_with_metadata` + interceptor in new development instead of the `post_search_jobs_for_alert` interceptor. + When both interceptors are used, this `post_search_jobs_for_alert_with_metadata` interceptor runs after the + `post_search_jobs_for_alert` interceptor. The (possibly modified) response returned by + `post_search_jobs_for_alert` will be passed to + `post_search_jobs_for_alert_with_metadata`. + """ + return response, metadata + def pre_update_job( self, request: job_service.UpdateJobRequest, @@ -367,12 +547,33 @@ def pre_update_job( def post_update_job(self, response: gct_job.Job) -> gct_job.Job: """Post-rpc interceptor for update_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_update_job` interceptor runs + before the `post_update_job_with_metadata` interceptor. """ return response + def post_update_job_with_metadata( + self, response: gct_job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_update_job_with_metadata` + interceptor in new development instead of the `post_update_job` interceptor. + When both interceptors are used, this `post_update_job_with_metadata` interceptor runs after the + `post_update_job` interceptor. The (possibly modified) response returned by + `post_update_job` will be passed to + `post_update_job_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -647,6 +848,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -796,6 +1001,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_delete_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_delete_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -945,6 +1154,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1097,6 +1310,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1349,6 +1566,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1491,6 +1712,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1639,6 +1864,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1787,6 +2016,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_jobs_for_alert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_jobs_for_alert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1939,6 +2172,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/client.py index 80e20ba97875..278ab4a9be91 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -484,6 +486,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -1328,16 +1357,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/transports/rest.py index 9cf5767dc7b6..e1deb5e921ae 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4/services/tenant_service/transports/rest.py @@ -131,12 +131,35 @@ def pre_create_tenant( def post_create_tenant(self, response: gct_tenant.Tenant) -> gct_tenant.Tenant: """Post-rpc interceptor for create_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_create_tenant` interceptor runs + before the `post_create_tenant_with_metadata` interceptor. """ return response + def post_create_tenant_with_metadata( + self, + response: gct_tenant.Tenant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_create_tenant_with_metadata` + interceptor in new development instead of the `post_create_tenant` interceptor. + When both interceptors are used, this `post_create_tenant_with_metadata` interceptor runs after the + `post_create_tenant` interceptor. The (possibly modified) response returned by + `post_create_tenant` will be passed to + `post_create_tenant_with_metadata`. + """ + return response, metadata + def pre_delete_tenant( self, request: tenant_service.DeleteTenantRequest, @@ -168,12 +191,33 @@ def pre_get_tenant( def post_get_tenant(self, response: tenant.Tenant) -> tenant.Tenant: """Post-rpc interceptor for get_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_get_tenant` interceptor runs + before the `post_get_tenant_with_metadata` interceptor. """ return response + def post_get_tenant_with_metadata( + self, response: tenant.Tenant, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_get_tenant_with_metadata` + interceptor in new development instead of the `post_get_tenant` interceptor. + When both interceptors are used, this `post_get_tenant_with_metadata` interceptor runs after the + `post_get_tenant` interceptor. The (possibly modified) response returned by + `post_get_tenant` will be passed to + `post_get_tenant_with_metadata`. + """ + return response, metadata + def pre_list_tenants( self, request: tenant_service.ListTenantsRequest, @@ -193,12 +237,37 @@ def post_list_tenants( ) -> tenant_service.ListTenantsResponse: """Post-rpc interceptor for list_tenants - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tenants_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_list_tenants` interceptor runs + before the `post_list_tenants_with_metadata` interceptor. """ return response + def post_list_tenants_with_metadata( + self, + response: tenant_service.ListTenantsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + tenant_service.ListTenantsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tenants + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_list_tenants_with_metadata` + interceptor in new development instead of the `post_list_tenants` interceptor. + When both interceptors are used, this `post_list_tenants_with_metadata` interceptor runs after the + `post_list_tenants` interceptor. The (possibly modified) response returned by + `post_list_tenants` will be passed to + `post_list_tenants_with_metadata`. + """ + return response, metadata + def pre_update_tenant( self, request: tenant_service.UpdateTenantRequest, @@ -216,12 +285,35 @@ def pre_update_tenant( def post_update_tenant(self, response: gct_tenant.Tenant) -> gct_tenant.Tenant: """Post-rpc interceptor for update_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_update_tenant` interceptor runs + before the `post_update_tenant_with_metadata` interceptor. """ return response + def post_update_tenant_with_metadata( + self, + response: gct_tenant.Tenant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_update_tenant_with_metadata` + interceptor in new development instead of the `post_update_tenant` interceptor. + When both interceptors are used, this `post_update_tenant_with_metadata` interceptor runs after the + `post_update_tenant` interceptor. The (possibly modified) response returned by + `post_update_tenant` will be passed to + `post_update_tenant_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -466,6 +558,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -723,6 +819,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -866,6 +966,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tenants(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tenants_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1022,6 +1126,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/gapic_version.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/gapic_version.py index e154065d8da8..558c8aab67c5 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/gapic_version.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.16.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/client.py index 7c749fd5dd73..5e982593e3e6 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -491,6 +493,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. @@ -1333,16 +1362,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/transports/rest.py index 7c8ced42def4..8a8268878cc2 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/company_service/transports/rest.py @@ -131,12 +131,35 @@ def pre_create_company( def post_create_company(self, response: gct_company.Company) -> gct_company.Company: """Post-rpc interceptor for create_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_create_company` interceptor runs + before the `post_create_company_with_metadata` interceptor. """ return response + def post_create_company_with_metadata( + self, + response: gct_company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_create_company_with_metadata` + interceptor in new development instead of the `post_create_company` interceptor. + When both interceptors are used, this `post_create_company_with_metadata` interceptor runs after the + `post_create_company` interceptor. The (possibly modified) response returned by + `post_create_company` will be passed to + `post_create_company_with_metadata`. + """ + return response, metadata + def pre_delete_company( self, request: company_service.DeleteCompanyRequest, @@ -168,12 +191,35 @@ def pre_get_company( def post_get_company(self, response: company.Company) -> company.Company: """Post-rpc interceptor for get_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_get_company` interceptor runs + before the `post_get_company_with_metadata` interceptor. """ return response + def post_get_company_with_metadata( + self, + response: company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_get_company_with_metadata` + interceptor in new development instead of the `post_get_company` interceptor. + When both interceptors are used, this `post_get_company_with_metadata` interceptor runs after the + `post_get_company` interceptor. The (possibly modified) response returned by + `post_get_company` will be passed to + `post_get_company_with_metadata`. + """ + return response, metadata + def pre_list_companies( self, request: company_service.ListCompaniesRequest, @@ -193,12 +239,37 @@ def post_list_companies( ) -> company_service.ListCompaniesResponse: """Post-rpc interceptor for list_companies - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_companies_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_list_companies` interceptor runs + before the `post_list_companies_with_metadata` interceptor. """ return response + def post_list_companies_with_metadata( + self, + response: company_service.ListCompaniesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + company_service.ListCompaniesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_companies + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_list_companies_with_metadata` + interceptor in new development instead of the `post_list_companies` interceptor. + When both interceptors are used, this `post_list_companies_with_metadata` interceptor runs after the + `post_list_companies` interceptor. The (possibly modified) response returned by + `post_list_companies` will be passed to + `post_list_companies_with_metadata`. + """ + return response, metadata + def pre_update_company( self, request: company_service.UpdateCompanyRequest, @@ -216,12 +287,35 @@ def pre_update_company( def post_update_company(self, response: gct_company.Company) -> gct_company.Company: """Post-rpc interceptor for update_company - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_company_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CompanyService server but before - it is returned to user code. + it is returned to user code. This `post_update_company` interceptor runs + before the `post_update_company_with_metadata` interceptor. """ return response + def post_update_company_with_metadata( + self, + response: gct_company.Company, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_company.Company, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_company + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CompanyService server but before it is returned to user code. + + We recommend only using this `post_update_company_with_metadata` + interceptor in new development instead of the `post_update_company` interceptor. + When both interceptors are used, this `post_update_company_with_metadata` interceptor runs after the + `post_update_company` interceptor. The (possibly modified) response returned by + `post_update_company` will be passed to + `post_update_company_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -465,6 +559,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -720,6 +818,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -861,6 +963,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_companies(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_companies_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1016,6 +1122,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_company(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_company_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/client.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/client.py index 71cd10d3f048..690c32873ce1 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/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 @@ -483,6 +485,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. @@ -818,16 +847,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/transports/rest.py index c8f192e373e3..3658a966ae3e 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/completion/transports/rest.py @@ -102,12 +102,38 @@ def post_complete_query( ) -> completion_service.CompleteQueryResponse: """Post-rpc interceptor for complete_query - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_complete_query_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Completion server but before - it is returned to user code. + it is returned to user code. This `post_complete_query` interceptor runs + before the `post_complete_query_with_metadata` interceptor. """ return response + def post_complete_query_with_metadata( + self, + response: completion_service.CompleteQueryResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + completion_service.CompleteQueryResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for complete_query + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Completion server but before it is returned to user code. + + We recommend only using this `post_complete_query_with_metadata` + interceptor in new development instead of the `post_complete_query` interceptor. + When both interceptors are used, this `post_complete_query_with_metadata` interceptor runs after the + `post_complete_query` interceptor. The (possibly modified) response returned by + `post_complete_query` will be passed to + `post_complete_query_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -341,6 +367,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_complete_query(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_complete_query_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/client.py index 84a0e41cee41..15c716c43bfd 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -484,6 +486,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -875,16 +904,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/transports/rest.py index e085991140a3..74cc2215ea33 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/event_service/transports/rest.py @@ -102,12 +102,35 @@ def post_create_client_event( ) -> event.ClientEvent: """Post-rpc interceptor for create_client_event - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_client_event_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the EventService server but before - it is returned to user code. + it is returned to user code. This `post_create_client_event` interceptor runs + before the `post_create_client_event_with_metadata` interceptor. """ return response + def post_create_client_event_with_metadata( + self, + response: event.ClientEvent, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[event.ClientEvent, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_client_event + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the EventService server but before it is returned to user code. + + We recommend only using this `post_create_client_event_with_metadata` + interceptor in new development instead of the `post_create_client_event` interceptor. + When both interceptors are used, this `post_create_client_event_with_metadata` interceptor runs after the + `post_create_client_event` interceptor. The (possibly modified) response returned by + `post_create_client_event` will be passed to + `post_create_client_event_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -355,6 +378,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_client_event(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_client_event_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/client.py index a30181bfe478..bfeb3d598717 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -514,6 +516,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2005,16 +2034,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/transports/rest.py index 7ea696345cc0..11234f3ebe11 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/job_service/transports/rest.py @@ -169,12 +169,35 @@ def post_batch_create_jobs( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_create_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_create_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_batch_create_jobs` interceptor runs + before the `post_batch_create_jobs_with_metadata` interceptor. """ return response + def post_batch_create_jobs_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_create_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_batch_create_jobs_with_metadata` + interceptor in new development instead of the `post_batch_create_jobs` interceptor. + When both interceptors are used, this `post_batch_create_jobs_with_metadata` interceptor runs after the + `post_batch_create_jobs` interceptor. The (possibly modified) response returned by + `post_batch_create_jobs` will be passed to + `post_batch_create_jobs_with_metadata`. + """ + return response, metadata + def pre_batch_delete_jobs( self, request: job_service.BatchDeleteJobsRequest, @@ -208,12 +231,35 @@ def post_batch_update_jobs( ) -> operations_pb2.Operation: """Post-rpc interceptor for batch_update_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_batch_update_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_batch_update_jobs` interceptor runs + before the `post_batch_update_jobs_with_metadata` interceptor. """ return response + def post_batch_update_jobs_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for batch_update_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_batch_update_jobs_with_metadata` + interceptor in new development instead of the `post_batch_update_jobs` interceptor. + When both interceptors are used, this `post_batch_update_jobs_with_metadata` interceptor runs after the + `post_batch_update_jobs` interceptor. The (possibly modified) response returned by + `post_batch_update_jobs` will be passed to + `post_batch_update_jobs_with_metadata`. + """ + return response, metadata + def pre_create_job( self, request: job_service.CreateJobRequest, @@ -229,12 +275,33 @@ def pre_create_job( def post_create_job(self, response: gct_job.Job) -> gct_job.Job: """Post-rpc interceptor for create_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_create_job` interceptor runs + before the `post_create_job_with_metadata` interceptor. """ return response + def post_create_job_with_metadata( + self, response: gct_job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_create_job_with_metadata` + interceptor in new development instead of the `post_create_job` interceptor. + When both interceptors are used, this `post_create_job_with_metadata` interceptor runs after the + `post_create_job` interceptor. The (possibly modified) response returned by + `post_create_job` will be passed to + `post_create_job_with_metadata`. + """ + return response, metadata + def pre_delete_job( self, request: job_service.DeleteJobRequest, @@ -262,12 +329,33 @@ def pre_get_job( def post_get_job(self, response: job.Job) -> job.Job: """Post-rpc interceptor for get_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_get_job` interceptor runs + before the `post_get_job_with_metadata` interceptor. """ return response + def post_get_job_with_metadata( + self, response: job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_get_job_with_metadata` + interceptor in new development instead of the `post_get_job` interceptor. + When both interceptors are used, this `post_get_job_with_metadata` interceptor runs after the + `post_get_job` interceptor. The (possibly modified) response returned by + `post_get_job` will be passed to + `post_get_job_with_metadata`. + """ + return response, metadata + def pre_list_jobs( self, request: job_service.ListJobsRequest, @@ -285,12 +373,35 @@ def post_list_jobs( ) -> job_service.ListJobsResponse: """Post-rpc interceptor for list_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_list_jobs` interceptor runs + before the `post_list_jobs_with_metadata` interceptor. """ return response + def post_list_jobs_with_metadata( + self, + response: job_service.ListJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.ListJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_list_jobs_with_metadata` + interceptor in new development instead of the `post_list_jobs` interceptor. + When both interceptors are used, this `post_list_jobs_with_metadata` interceptor runs after the + `post_list_jobs` interceptor. The (possibly modified) response returned by + `post_list_jobs` will be passed to + `post_list_jobs_with_metadata`. + """ + return response, metadata + def pre_search_jobs( self, request: job_service.SearchJobsRequest, @@ -308,12 +419,35 @@ def post_search_jobs( ) -> job_service.SearchJobsResponse: """Post-rpc interceptor for search_jobs - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_jobs_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_search_jobs` interceptor runs + before the `post_search_jobs_with_metadata` interceptor. """ return response + def post_search_jobs_with_metadata( + self, + response: job_service.SearchJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.SearchJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_jobs + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_search_jobs_with_metadata` + interceptor in new development instead of the `post_search_jobs` interceptor. + When both interceptors are used, this `post_search_jobs_with_metadata` interceptor runs after the + `post_search_jobs` interceptor. The (possibly modified) response returned by + `post_search_jobs` will be passed to + `post_search_jobs_with_metadata`. + """ + return response, metadata + def pre_search_jobs_for_alert( self, request: job_service.SearchJobsRequest, @@ -331,12 +465,35 @@ def post_search_jobs_for_alert( ) -> job_service.SearchJobsResponse: """Post-rpc interceptor for search_jobs_for_alert - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_jobs_for_alert_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_search_jobs_for_alert` interceptor runs + before the `post_search_jobs_for_alert_with_metadata` interceptor. """ return response + def post_search_jobs_for_alert_with_metadata( + self, + response: job_service.SearchJobsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[job_service.SearchJobsResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for search_jobs_for_alert + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_search_jobs_for_alert_with_metadata` + interceptor in new development instead of the `post_search_jobs_for_alert` interceptor. + When both interceptors are used, this `post_search_jobs_for_alert_with_metadata` interceptor runs after the + `post_search_jobs_for_alert` interceptor. The (possibly modified) response returned by + `post_search_jobs_for_alert` will be passed to + `post_search_jobs_for_alert_with_metadata`. + """ + return response, metadata + def pre_update_job( self, request: job_service.UpdateJobRequest, @@ -352,12 +509,33 @@ def pre_update_job( def post_update_job(self, response: gct_job.Job) -> gct_job.Job: """Post-rpc interceptor for update_job - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_job_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the JobService server but before - it is returned to user code. + it is returned to user code. This `post_update_job` interceptor runs + before the `post_update_job_with_metadata` interceptor. """ return response + def post_update_job_with_metadata( + self, response: gct_job.Job, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_job.Job, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_job + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the JobService server but before it is returned to user code. + + We recommend only using this `post_update_job_with_metadata` + interceptor in new development instead of the `post_update_job` interceptor. + When both interceptors are used, this `post_update_job_with_metadata` interceptor runs after the + `post_update_job` interceptor. The (possibly modified) response returned by + `post_update_job` will be passed to + `post_update_job_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -632,6 +810,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_create_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_create_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -895,6 +1077,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_batch_update_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_batch_update_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1048,6 +1234,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1301,6 +1491,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1443,6 +1637,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1591,6 +1789,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_jobs(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_jobs_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1739,6 +1941,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_jobs_for_alert(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_jobs_for_alert_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1892,6 +2098,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_job(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_job_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/client.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/client.py index 009c5df95afc..b55777cc6f65 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/client.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -483,6 +485,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. @@ -1308,16 +1337,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/transports/rest.py b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/transports/rest.py index 6693140e5ba5..d53cf9d416a5 100644 --- a/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/transports/rest.py +++ b/packages/google-cloud-talent/google/cloud/talent_v4beta1/services/tenant_service/transports/rest.py @@ -131,12 +131,35 @@ def pre_create_tenant( def post_create_tenant(self, response: gct_tenant.Tenant) -> gct_tenant.Tenant: """Post-rpc interceptor for create_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_create_tenant` interceptor runs + before the `post_create_tenant_with_metadata` interceptor. """ return response + def post_create_tenant_with_metadata( + self, + response: gct_tenant.Tenant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_create_tenant_with_metadata` + interceptor in new development instead of the `post_create_tenant` interceptor. + When both interceptors are used, this `post_create_tenant_with_metadata` interceptor runs after the + `post_create_tenant` interceptor. The (possibly modified) response returned by + `post_create_tenant` will be passed to + `post_create_tenant_with_metadata`. + """ + return response, metadata + def pre_delete_tenant( self, request: tenant_service.DeleteTenantRequest, @@ -168,12 +191,33 @@ def pre_get_tenant( def post_get_tenant(self, response: tenant.Tenant) -> tenant.Tenant: """Post-rpc interceptor for get_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_get_tenant` interceptor runs + before the `post_get_tenant_with_metadata` interceptor. """ return response + def post_get_tenant_with_metadata( + self, response: tenant.Tenant, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_get_tenant_with_metadata` + interceptor in new development instead of the `post_get_tenant` interceptor. + When both interceptors are used, this `post_get_tenant_with_metadata` interceptor runs after the + `post_get_tenant` interceptor. The (possibly modified) response returned by + `post_get_tenant` will be passed to + `post_get_tenant_with_metadata`. + """ + return response, metadata + def pre_list_tenants( self, request: tenant_service.ListTenantsRequest, @@ -193,12 +237,37 @@ def post_list_tenants( ) -> tenant_service.ListTenantsResponse: """Post-rpc interceptor for list_tenants - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tenants_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_list_tenants` interceptor runs + before the `post_list_tenants_with_metadata` interceptor. """ return response + def post_list_tenants_with_metadata( + self, + response: tenant_service.ListTenantsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + tenant_service.ListTenantsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_tenants + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_list_tenants_with_metadata` + interceptor in new development instead of the `post_list_tenants` interceptor. + When both interceptors are used, this `post_list_tenants_with_metadata` interceptor runs after the + `post_list_tenants` interceptor. The (possibly modified) response returned by + `post_list_tenants` will be passed to + `post_list_tenants_with_metadata`. + """ + return response, metadata + def pre_update_tenant( self, request: tenant_service.UpdateTenantRequest, @@ -216,12 +285,35 @@ def pre_update_tenant( def post_update_tenant(self, response: gct_tenant.Tenant) -> gct_tenant.Tenant: """Post-rpc interceptor for update_tenant - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_tenant_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TenantService server but before - it is returned to user code. + it is returned to user code. This `post_update_tenant` interceptor runs + before the `post_update_tenant_with_metadata` interceptor. """ return response + def post_update_tenant_with_metadata( + self, + response: gct_tenant.Tenant, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_tenant.Tenant, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_tenant + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TenantService server but before it is returned to user code. + + We recommend only using this `post_update_tenant_with_metadata` + interceptor in new development instead of the `post_update_tenant` interceptor. + When both interceptors are used, this `post_update_tenant_with_metadata` interceptor runs after the + `post_update_tenant` interceptor. The (possibly modified) response returned by + `post_update_tenant` will be passed to + `post_update_tenant_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -466,6 +558,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -723,6 +819,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -866,6 +966,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tenants(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tenants_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1022,6 +1126,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_tenant(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_tenant_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4.json b/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4.json index 0e4d6a1f74be..8caa824f22f3 100644 --- a/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4.json +++ b/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-talent", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4beta1.json b/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4beta1.json index 37dc774f6d3d..580e0ed3b33e 100644 --- a/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4beta1.json +++ b/packages/google-cloud-talent/samples/generated_samples/snippet_metadata_google.cloud.talent.v4beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-talent", - "version": "2.16.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_company_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_company_service.py index d086959a3b3b..2b67cd1c4774 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_company_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_company_service.py @@ -67,6 +67,13 @@ from google.cloud.talent_v4.types import company as gct_company from google.cloud.talent_v4.types import company_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -325,6 +332,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 = CompanyServiceClient(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 = CompanyServiceClient(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", [ @@ -4617,10 +4667,13 @@ def test_create_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_create_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_create_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_create_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.CreateCompanyRequest.pb( company_service.CreateCompanyRequest() ) @@ -4644,6 +4697,7 @@ def test_create_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_company.Company() + post_with_metadata.return_value = gct_company.Company(), metadata client.create_company( request, @@ -4655,6 +4709,7 @@ def test_create_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_company_rest_bad_request(request_type=company_service.GetCompanyRequest): @@ -4763,10 +4818,13 @@ def test_get_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_get_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_get_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_get_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.GetCompanyRequest.pb( company_service.GetCompanyRequest() ) @@ -4790,6 +4848,7 @@ def test_get_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = company.Company() + post_with_metadata.return_value = company.Company(), metadata client.get_company( request, @@ -4801,6 +4860,7 @@ def test_get_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_company_rest_bad_request( @@ -5019,10 +5079,13 @@ def test_update_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_update_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_update_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_update_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.UpdateCompanyRequest.pb( company_service.UpdateCompanyRequest() ) @@ -5046,6 +5109,7 @@ def test_update_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_company.Company() + post_with_metadata.return_value = gct_company.Company(), metadata client.update_company( request, @@ -5057,6 +5121,7 @@ def test_update_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_company_rest_bad_request( @@ -5250,10 +5315,13 @@ def test_list_companies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_list_companies" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_list_companies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_list_companies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.ListCompaniesRequest.pb( company_service.ListCompaniesRequest() ) @@ -5279,6 +5347,10 @@ def test_list_companies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = company_service.ListCompaniesResponse() + post_with_metadata.return_value = ( + company_service.ListCompaniesResponse(), + metadata, + ) client.list_companies( request, @@ -5290,6 +5362,7 @@ def test_list_companies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_completion.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_completion.py index 76de2040a8f8..a41d5d6faef3 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_completion.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_completion.py @@ -60,6 +60,13 @@ ) from google.cloud.talent_v4.types import common, completion_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -295,6 +302,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CompletionClient(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 = CompletionClient(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", [ @@ -1687,10 +1737,13 @@ def test_complete_query_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompletionRestInterceptor, "post_complete_query" ) as post, mock.patch.object( + transports.CompletionRestInterceptor, "post_complete_query_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompletionRestInterceptor, "pre_complete_query" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = completion_service.CompleteQueryRequest.pb( completion_service.CompleteQueryRequest() ) @@ -1716,6 +1769,10 @@ def test_complete_query_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = completion_service.CompleteQueryResponse() + post_with_metadata.return_value = ( + completion_service.CompleteQueryResponse(), + metadata, + ) client.complete_query( request, @@ -1727,6 +1784,7 @@ def test_complete_query_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_event_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_event_service.py index 6e870c342bf1..3e29bc74a042 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_event_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_event_service.py @@ -61,6 +61,13 @@ ) from google.cloud.talent_v4.types import event, event_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = EventServiceClient(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 = EventServiceClient(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", [ @@ -1929,10 +1979,13 @@ def test_create_client_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventServiceRestInterceptor, "post_create_client_event" ) as post, mock.patch.object( + transports.EventServiceRestInterceptor, "post_create_client_event_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventServiceRestInterceptor, "pre_create_client_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_service.CreateClientEventRequest.pb( event_service.CreateClientEventRequest() ) @@ -1956,6 +2009,7 @@ def test_create_client_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event.ClientEvent() + post_with_metadata.return_value = event.ClientEvent(), metadata client.create_client_event( request, @@ -1967,6 +2021,7 @@ def test_create_client_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_job_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_job_service.py index 103ea374fa1b..bce5a4feb1c1 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_job_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_job_service.py @@ -81,6 +81,13 @@ from google.cloud.talent_v4.types import job as gct_job from google.cloud.talent_v4.types import job_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -316,6 +323,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = JobServiceClient(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 = JobServiceClient(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", [ @@ -7383,10 +7433,13 @@ def test_create_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_create_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_create_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_create_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.CreateJobRequest.pb(job_service.CreateJobRequest()) transcode.return_value = { "method": "post", @@ -7408,6 +7461,7 @@ def test_create_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_job.Job() + post_with_metadata.return_value = gct_job.Job(), metadata client.create_job( request, @@ -7419,6 +7473,7 @@ def test_create_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_jobs_rest_bad_request( @@ -7499,10 +7554,13 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): ), mock.patch.object( transports.JobServiceRestInterceptor, "post_batch_create_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_batch_create_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_batch_create_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.BatchCreateJobsRequest.pb( job_service.BatchCreateJobsRequest() ) @@ -7526,6 +7584,7 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_create_jobs( request, @@ -7537,6 +7596,7 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_job_rest_bad_request(request_type=job_service.GetJobRequest): @@ -7655,10 +7715,13 @@ def test_get_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_get_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_get_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_get_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.GetJobRequest.pb(job_service.GetJobRequest()) transcode.return_value = { "method": "post", @@ -7680,6 +7743,7 @@ def test_get_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job.Job() + post_with_metadata.return_value = job.Job(), metadata client.get_job( request, @@ -7691,6 +7755,7 @@ def test_get_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_job_rest_bad_request(request_type=job_service.UpdateJobRequest): @@ -7957,10 +8022,13 @@ def test_update_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_update_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_update_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_update_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.UpdateJobRequest.pb(job_service.UpdateJobRequest()) transcode.return_value = { "method": "post", @@ -7982,6 +8050,7 @@ def test_update_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_job.Job() + post_with_metadata.return_value = gct_job.Job(), metadata client.update_job( request, @@ -7993,6 +8062,7 @@ def test_update_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_jobs_rest_bad_request( @@ -8073,10 +8143,13 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): ), mock.patch.object( transports.JobServiceRestInterceptor, "post_batch_update_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_batch_update_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_batch_update_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.BatchUpdateJobsRequest.pb( job_service.BatchUpdateJobsRequest() ) @@ -8100,6 +8173,7 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_update_jobs( request, @@ -8111,6 +8185,7 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_job_rest_bad_request(request_type=job_service.DeleteJobRequest): @@ -8296,10 +8371,13 @@ def test_batch_delete_jobs_rest_interceptors(null_interceptor): ), mock.patch.object( transports.JobServiceRestInterceptor, "post_batch_delete_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_batch_delete_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_batch_delete_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.BatchDeleteJobsRequest.pb( job_service.BatchDeleteJobsRequest() ) @@ -8323,6 +8401,7 @@ def test_batch_delete_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_delete_jobs( request, @@ -8334,6 +8413,7 @@ def test_batch_delete_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_jobs_rest_bad_request(request_type=job_service.ListJobsRequest): @@ -8416,10 +8496,13 @@ def test_list_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_list_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_list_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_list_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.ListJobsRequest.pb(job_service.ListJobsRequest()) transcode.return_value = { "method": "post", @@ -8443,6 +8526,7 @@ def test_list_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.ListJobsResponse() + post_with_metadata.return_value = job_service.ListJobsResponse(), metadata client.list_jobs( request, @@ -8454,6 +8538,7 @@ def test_list_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_jobs_rest_bad_request(request_type=job_service.SearchJobsRequest): @@ -8542,10 +8627,13 @@ def test_search_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_search_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_search_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_search_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.SearchJobsRequest.pb(job_service.SearchJobsRequest()) transcode.return_value = { "method": "post", @@ -8569,6 +8657,7 @@ def test_search_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.SearchJobsResponse() + post_with_metadata.return_value = job_service.SearchJobsResponse(), metadata client.search_jobs( request, @@ -8580,6 +8669,7 @@ def test_search_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_jobs_for_alert_rest_bad_request( @@ -8670,10 +8760,13 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_search_jobs_for_alert" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_search_jobs_for_alert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_search_jobs_for_alert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.SearchJobsRequest.pb(job_service.SearchJobsRequest()) transcode.return_value = { "method": "post", @@ -8697,6 +8790,7 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.SearchJobsResponse() + post_with_metadata.return_value = job_service.SearchJobsResponse(), metadata client.search_jobs_for_alert( request, @@ -8708,6 +8802,7 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_tenant_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_tenant_service.py index 06b682422875..186f48fbaecd 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_tenant_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4/test_tenant_service.py @@ -64,6 +64,13 @@ from google.cloud.talent_v4.types import tenant as gct_tenant from google.cloud.talent_v4.types import tenant_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -318,6 +325,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TenantServiceClient(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 = TenantServiceClient(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", [ @@ -4356,10 +4406,13 @@ def test_create_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_create_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_create_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_create_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.CreateTenantRequest.pb( tenant_service.CreateTenantRequest() ) @@ -4383,6 +4436,7 @@ def test_create_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_tenant.Tenant() + post_with_metadata.return_value = gct_tenant.Tenant(), metadata client.create_tenant( request, @@ -4394,6 +4448,7 @@ def test_create_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tenant_rest_bad_request(request_type=tenant_service.GetTenantRequest): @@ -4478,10 +4533,13 @@ def test_get_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_get_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_get_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_get_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.GetTenantRequest.pb( tenant_service.GetTenantRequest() ) @@ -4505,6 +4563,7 @@ def test_get_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tenant.Tenant() + post_with_metadata.return_value = tenant.Tenant(), metadata client.get_tenant( request, @@ -4516,6 +4575,7 @@ def test_get_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tenant_rest_bad_request( @@ -4673,10 +4733,13 @@ def test_update_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_update_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_update_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_update_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.UpdateTenantRequest.pb( tenant_service.UpdateTenantRequest() ) @@ -4700,6 +4763,7 @@ def test_update_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_tenant.Tenant() + post_with_metadata.return_value = gct_tenant.Tenant(), metadata client.update_tenant( request, @@ -4711,6 +4775,7 @@ def test_update_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tenant_rest_bad_request( @@ -4902,10 +4967,13 @@ def test_list_tenants_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_list_tenants" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_list_tenants_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_list_tenants" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.ListTenantsRequest.pb( tenant_service.ListTenantsRequest() ) @@ -4931,6 +4999,7 @@ def test_list_tenants_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tenant_service.ListTenantsResponse() + post_with_metadata.return_value = tenant_service.ListTenantsResponse(), metadata client.list_tenants( request, @@ -4942,6 +5011,7 @@ def test_list_tenants_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_company_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_company_service.py index 5f0fe16efcbf..e65965a2524a 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_company_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_company_service.py @@ -67,6 +67,13 @@ from google.cloud.talent_v4beta1.types import company as gct_company from google.cloud.talent_v4beta1.types import company_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -325,6 +332,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 = CompanyServiceClient(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 = CompanyServiceClient(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", [ @@ -4503,10 +4553,13 @@ def test_create_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_create_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_create_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_create_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.CreateCompanyRequest.pb( company_service.CreateCompanyRequest() ) @@ -4530,6 +4583,7 @@ def test_create_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_company.Company() + post_with_metadata.return_value = gct_company.Company(), metadata client.create_company( request, @@ -4541,6 +4595,7 @@ def test_create_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_company_rest_bad_request(request_type=company_service.GetCompanyRequest): @@ -4649,10 +4704,13 @@ def test_get_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_get_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_get_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_get_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.GetCompanyRequest.pb( company_service.GetCompanyRequest() ) @@ -4676,6 +4734,7 @@ def test_get_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = company.Company() + post_with_metadata.return_value = company.Company(), metadata client.get_company( request, @@ -4687,6 +4746,7 @@ def test_get_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_company_rest_bad_request( @@ -4801,10 +4861,13 @@ def test_update_company_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_update_company" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_update_company_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_update_company" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.UpdateCompanyRequest.pb( company_service.UpdateCompanyRequest() ) @@ -4828,6 +4891,7 @@ def test_update_company_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_company.Company() + post_with_metadata.return_value = gct_company.Company(), metadata client.update_company( request, @@ -4839,6 +4903,7 @@ def test_update_company_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_company_rest_bad_request( @@ -5032,10 +5097,13 @@ def test_list_companies_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompanyServiceRestInterceptor, "post_list_companies" ) as post, mock.patch.object( + transports.CompanyServiceRestInterceptor, "post_list_companies_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompanyServiceRestInterceptor, "pre_list_companies" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = company_service.ListCompaniesRequest.pb( company_service.ListCompaniesRequest() ) @@ -5061,6 +5129,10 @@ def test_list_companies_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = company_service.ListCompaniesResponse() + post_with_metadata.return_value = ( + company_service.ListCompaniesResponse(), + metadata, + ) client.list_companies( request, @@ -5072,6 +5144,7 @@ def test_list_companies_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_completion.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_completion.py index b70551a16a57..59fd10e42074 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_completion.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_completion.py @@ -60,6 +60,13 @@ ) from google.cloud.talent_v4beta1.types import common, completion_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -295,6 +302,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CompletionClient(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 = CompletionClient(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", [ @@ -1687,10 +1737,13 @@ def test_complete_query_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CompletionRestInterceptor, "post_complete_query" ) as post, mock.patch.object( + transports.CompletionRestInterceptor, "post_complete_query_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CompletionRestInterceptor, "pre_complete_query" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = completion_service.CompleteQueryRequest.pb( completion_service.CompleteQueryRequest() ) @@ -1716,6 +1769,10 @@ def test_complete_query_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = completion_service.CompleteQueryResponse() + post_with_metadata.return_value = ( + completion_service.CompleteQueryResponse(), + metadata, + ) client.complete_query( request, @@ -1727,6 +1784,7 @@ def test_complete_query_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_event_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_event_service.py index bb54fa977fac..3bf1f8a71092 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_event_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_event_service.py @@ -61,6 +61,13 @@ ) from google.cloud.talent_v4beta1.types import event, event_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -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 = EventServiceClient(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 = EventServiceClient(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", [ @@ -1856,10 +1906,13 @@ def test_create_client_event_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.EventServiceRestInterceptor, "post_create_client_event" ) as post, mock.patch.object( + transports.EventServiceRestInterceptor, "post_create_client_event_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.EventServiceRestInterceptor, "pre_create_client_event" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = event_service.CreateClientEventRequest.pb( event_service.CreateClientEventRequest() ) @@ -1883,6 +1936,7 @@ def test_create_client_event_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = event.ClientEvent() + post_with_metadata.return_value = event.ClientEvent(), metadata client.create_client_event( request, @@ -1894,6 +1948,7 @@ def test_create_client_event_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_job_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_job_service.py index 451b4d1e6bec..d4da56f402af 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_job_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_job_service.py @@ -81,6 +81,13 @@ from google.cloud.talent_v4beta1.types import job as gct_job from google.cloud.talent_v4beta1.types import job_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -316,6 +323,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = JobServiceClient(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 = JobServiceClient(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", [ @@ -7756,10 +7806,13 @@ def test_create_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_create_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_create_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_create_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.CreateJobRequest.pb(job_service.CreateJobRequest()) transcode.return_value = { "method": "post", @@ -7781,6 +7834,7 @@ def test_create_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_job.Job() + post_with_metadata.return_value = gct_job.Job(), metadata client.create_job( request, @@ -7792,6 +7846,7 @@ def test_create_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_create_jobs_rest_bad_request( @@ -7872,10 +7927,13 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): ), mock.patch.object( transports.JobServiceRestInterceptor, "post_batch_create_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_batch_create_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_batch_create_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.BatchCreateJobsRequest.pb( job_service.BatchCreateJobsRequest() ) @@ -7899,6 +7957,7 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_create_jobs( request, @@ -7910,6 +7969,7 @@ def test_batch_create_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_job_rest_bad_request(request_type=job_service.GetJobRequest): @@ -8028,10 +8088,13 @@ def test_get_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_get_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_get_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_get_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.GetJobRequest.pb(job_service.GetJobRequest()) transcode.return_value = { "method": "post", @@ -8053,6 +8116,7 @@ def test_get_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job.Job() + post_with_metadata.return_value = job.Job(), metadata client.get_job( request, @@ -8064,6 +8128,7 @@ def test_get_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_job_rest_bad_request(request_type=job_service.UpdateJobRequest): @@ -8182,10 +8247,13 @@ def test_update_job_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_update_job" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_update_job_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_update_job" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.UpdateJobRequest.pb(job_service.UpdateJobRequest()) transcode.return_value = { "method": "post", @@ -8207,6 +8275,7 @@ def test_update_job_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_job.Job() + post_with_metadata.return_value = gct_job.Job(), metadata client.update_job( request, @@ -8218,6 +8287,7 @@ def test_update_job_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_batch_update_jobs_rest_bad_request( @@ -8298,10 +8368,13 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): ), mock.patch.object( transports.JobServiceRestInterceptor, "post_batch_update_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_batch_update_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_batch_update_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.BatchUpdateJobsRequest.pb( job_service.BatchUpdateJobsRequest() ) @@ -8325,6 +8398,7 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.batch_update_jobs( request, @@ -8336,6 +8410,7 @@ def test_batch_update_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_job_rest_bad_request(request_type=job_service.DeleteJobRequest): @@ -8632,10 +8707,13 @@ def test_list_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_list_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_list_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_list_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.ListJobsRequest.pb(job_service.ListJobsRequest()) transcode.return_value = { "method": "post", @@ -8659,6 +8737,7 @@ def test_list_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.ListJobsResponse() + post_with_metadata.return_value = job_service.ListJobsResponse(), metadata client.list_jobs( request, @@ -8670,6 +8749,7 @@ def test_list_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_jobs_rest_bad_request(request_type=job_service.SearchJobsRequest): @@ -8758,10 +8838,13 @@ def test_search_jobs_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_search_jobs" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_search_jobs_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_search_jobs" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.SearchJobsRequest.pb(job_service.SearchJobsRequest()) transcode.return_value = { "method": "post", @@ -8785,6 +8868,7 @@ def test_search_jobs_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.SearchJobsResponse() + post_with_metadata.return_value = job_service.SearchJobsResponse(), metadata client.search_jobs( request, @@ -8796,6 +8880,7 @@ def test_search_jobs_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_jobs_for_alert_rest_bad_request( @@ -8886,10 +8971,13 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.JobServiceRestInterceptor, "post_search_jobs_for_alert" ) as post, mock.patch.object( + transports.JobServiceRestInterceptor, "post_search_jobs_for_alert_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.JobServiceRestInterceptor, "pre_search_jobs_for_alert" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = job_service.SearchJobsRequest.pb(job_service.SearchJobsRequest()) transcode.return_value = { "method": "post", @@ -8913,6 +9001,7 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = job_service.SearchJobsResponse() + post_with_metadata.return_value = job_service.SearchJobsResponse(), metadata client.search_jobs_for_alert( request, @@ -8924,6 +9013,7 @@ def test_search_jobs_for_alert_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_tenant_service.py b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_tenant_service.py index 476af07ae03d..5cf47e6a0cf2 100644 --- a/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_tenant_service.py +++ b/packages/google-cloud-talent/tests/unit/gapic/talent_v4beta1/test_tenant_service.py @@ -64,6 +64,13 @@ from google.cloud.talent_v4beta1.types import tenant as gct_tenant from google.cloud.talent_v4beta1.types import tenant_service +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -318,6 +325,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = TenantServiceClient(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 = TenantServiceClient(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", [ @@ -4343,10 +4393,13 @@ def test_create_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_create_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_create_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_create_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.CreateTenantRequest.pb( tenant_service.CreateTenantRequest() ) @@ -4370,6 +4423,7 @@ def test_create_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_tenant.Tenant() + post_with_metadata.return_value = gct_tenant.Tenant(), metadata client.create_tenant( request, @@ -4381,6 +4435,7 @@ def test_create_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_tenant_rest_bad_request(request_type=tenant_service.GetTenantRequest): @@ -4473,10 +4528,13 @@ def test_get_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_get_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_get_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_get_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.GetTenantRequest.pb( tenant_service.GetTenantRequest() ) @@ -4500,6 +4558,7 @@ def test_get_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tenant.Tenant() + post_with_metadata.return_value = tenant.Tenant(), metadata client.get_tenant( request, @@ -4511,6 +4570,7 @@ def test_get_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_tenant_rest_bad_request( @@ -4605,10 +4665,13 @@ def test_update_tenant_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_update_tenant" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_update_tenant_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_update_tenant" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.UpdateTenantRequest.pb( tenant_service.UpdateTenantRequest() ) @@ -4632,6 +4695,7 @@ def test_update_tenant_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_tenant.Tenant() + post_with_metadata.return_value = gct_tenant.Tenant(), metadata client.update_tenant( request, @@ -4643,6 +4707,7 @@ def test_update_tenant_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_tenant_rest_bad_request( @@ -4834,10 +4899,13 @@ def test_list_tenants_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TenantServiceRestInterceptor, "post_list_tenants" ) as post, mock.patch.object( + transports.TenantServiceRestInterceptor, "post_list_tenants_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TenantServiceRestInterceptor, "pre_list_tenants" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = tenant_service.ListTenantsRequest.pb( tenant_service.ListTenantsRequest() ) @@ -4863,6 +4931,7 @@ def test_list_tenants_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = tenant_service.ListTenantsResponse() + post_with_metadata.return_value = tenant_service.ListTenantsResponse(), metadata client.list_tenants( request, @@ -4874,6 +4943,7 @@ def test_list_tenants_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py index 1074c4de1723..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.18.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py index 1074c4de1723..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.18.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/client.py b/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/client.py index 0011a9677f64..c9d5b98d123b 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/client.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -520,6 +522,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2775,16 +2804,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2830,16 +2863,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/transports/rest.py b/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/transports/rest.py index 1f63d3f54c47..d33a4bcabee3 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/transports/rest.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2/services/cloud_tasks/transports/rest.py @@ -217,12 +217,35 @@ def pre_create_queue( def post_create_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for create_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_queue` interceptor runs + before the `post_create_queue_with_metadata` interceptor. """ return response + def post_create_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_queue_with_metadata` + interceptor in new development instead of the `post_create_queue` interceptor. + When both interceptors are used, this `post_create_queue_with_metadata` interceptor runs after the + `post_create_queue` interceptor. The (possibly modified) response returned by + `post_create_queue` will be passed to + `post_create_queue_with_metadata`. + """ + return response, metadata + def pre_create_task( self, request: cloudtasks.CreateTaskRequest, @@ -238,12 +261,33 @@ def pre_create_task( def post_create_task(self, response: gct_task.Task) -> gct_task.Task: """Post-rpc interceptor for create_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_task` interceptor runs + before the `post_create_task_with_metadata` interceptor. """ return response + def post_create_task_with_metadata( + self, response: gct_task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_task_with_metadata` + interceptor in new development instead of the `post_create_task` interceptor. + When both interceptors are used, this `post_create_task_with_metadata` interceptor runs after the + `post_create_task` interceptor. The (possibly modified) response returned by + `post_create_task` will be passed to + `post_create_task_with_metadata`. + """ + return response, metadata + def pre_delete_queue( self, request: cloudtasks.DeleteQueueRequest, @@ -285,12 +329,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.GetQueueRequest, @@ -306,12 +373,33 @@ def pre_get_queue( def post_get_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for get_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_queue` interceptor runs + before the `post_get_queue_with_metadata` interceptor. """ return response + def post_get_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_queue_with_metadata` + interceptor in new development instead of the `post_get_queue` interceptor. + When both interceptors are used, this `post_get_queue_with_metadata` interceptor runs after the + `post_get_queue` interceptor. The (possibly modified) response returned by + `post_get_queue` will be passed to + `post_get_queue_with_metadata`. + """ + return response, metadata + def pre_get_task( self, request: cloudtasks.GetTaskRequest, @@ -327,12 +415,33 @@ def pre_get_task( def post_get_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for get_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_task` interceptor runs + before the `post_get_task_with_metadata` interceptor. """ return response + def post_get_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_task_with_metadata` + interceptor in new development instead of the `post_get_task` interceptor. + When both interceptors are used, this `post_get_task_with_metadata` interceptor runs after the + `post_get_task` interceptor. The (possibly modified) response returned by + `post_get_task` will be passed to + `post_get_task_with_metadata`. + """ + return response, metadata + def pre_list_queues( self, request: cloudtasks.ListQueuesRequest, @@ -350,12 +459,35 @@ def post_list_queues( ) -> cloudtasks.ListQueuesResponse: """Post-rpc interceptor for list_queues - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_queues_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_queues` interceptor runs + before the `post_list_queues_with_metadata` interceptor. """ return response + def post_list_queues_with_metadata( + self, + response: cloudtasks.ListQueuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListQueuesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_queues + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_queues_with_metadata` + interceptor in new development instead of the `post_list_queues` interceptor. + When both interceptors are used, this `post_list_queues_with_metadata` interceptor runs after the + `post_list_queues` interceptor. The (possibly modified) response returned by + `post_list_queues` will be passed to + `post_list_queues_with_metadata`. + """ + return response, metadata + def pre_list_tasks( self, request: cloudtasks.ListTasksRequest, @@ -373,12 +505,35 @@ def post_list_tasks( ) -> cloudtasks.ListTasksResponse: """Post-rpc interceptor for list_tasks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tasks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_tasks` interceptor runs + before the `post_list_tasks_with_metadata` interceptor. """ return response + def post_list_tasks_with_metadata( + self, + response: cloudtasks.ListTasksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListTasksResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tasks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_tasks_with_metadata` + interceptor in new development instead of the `post_list_tasks` interceptor. + When both interceptors are used, this `post_list_tasks_with_metadata` interceptor runs after the + `post_list_tasks` interceptor. The (possibly modified) response returned by + `post_list_tasks` will be passed to + `post_list_tasks_with_metadata`. + """ + return response, metadata + def pre_pause_queue( self, request: cloudtasks.PauseQueueRequest, @@ -394,12 +549,33 @@ def pre_pause_queue( def post_pause_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for pause_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_pause_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_pause_queue` interceptor runs + before the `post_pause_queue_with_metadata` interceptor. """ return response + def post_pause_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for pause_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_pause_queue_with_metadata` + interceptor in new development instead of the `post_pause_queue` interceptor. + When both interceptors are used, this `post_pause_queue_with_metadata` interceptor runs after the + `post_pause_queue` interceptor. The (possibly modified) response returned by + `post_pause_queue` will be passed to + `post_pause_queue_with_metadata`. + """ + return response, metadata + def pre_purge_queue( self, request: cloudtasks.PurgeQueueRequest, @@ -415,12 +591,33 @@ def pre_purge_queue( def post_purge_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for purge_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_purge_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_purge_queue` interceptor runs + before the `post_purge_queue_with_metadata` interceptor. """ return response + def post_purge_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for purge_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_purge_queue_with_metadata` + interceptor in new development instead of the `post_purge_queue` interceptor. + When both interceptors are used, this `post_purge_queue_with_metadata` interceptor runs after the + `post_purge_queue` interceptor. The (possibly modified) response returned by + `post_purge_queue` will be passed to + `post_purge_queue_with_metadata`. + """ + return response, metadata + def pre_resume_queue( self, request: cloudtasks.ResumeQueueRequest, @@ -436,12 +633,33 @@ def pre_resume_queue( def post_resume_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for resume_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_resume_queue` interceptor runs + before the `post_resume_queue_with_metadata` interceptor. """ return response + def post_resume_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_resume_queue_with_metadata` + interceptor in new development instead of the `post_resume_queue` interceptor. + When both interceptors are used, this `post_resume_queue_with_metadata` interceptor runs after the + `post_resume_queue` interceptor. The (possibly modified) response returned by + `post_resume_queue` will be passed to + `post_resume_queue_with_metadata`. + """ + return response, metadata + def pre_run_task( self, request: cloudtasks.RunTaskRequest, @@ -457,12 +675,33 @@ def pre_run_task( def post_run_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for run_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_run_task` interceptor runs + before the `post_run_task_with_metadata` interceptor. """ return response + def post_run_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_run_task_with_metadata` + interceptor in new development instead of the `post_run_task` interceptor. + When both interceptors are used, this `post_run_task_with_metadata` interceptor runs after the + `post_run_task` interceptor. The (possibly modified) response returned by + `post_run_task` will be passed to + `post_run_task_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -480,12 +719,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -506,12 +768,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.UpdateQueueRequest, @@ -527,12 +815,35 @@ def pre_update_queue( def post_update_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for update_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_update_queue` interceptor runs + before the `post_update_queue_with_metadata` interceptor. """ return response + def post_update_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_update_queue_with_metadata` + interceptor in new development instead of the `post_update_queue` interceptor. + When both interceptors are used, this `post_update_queue_with_metadata` interceptor runs after the + `post_update_queue` interceptor. The (possibly modified) response returned by + `post_update_queue` will be passed to + `post_update_queue_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -805,6 +1116,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -954,6 +1269,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1401,6 +1720,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 @@ -1550,6 +1873,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1691,6 +2018,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1836,6 +2167,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_queues(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_queues_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1981,6 +2316,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tasks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tasks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2136,6 +2475,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_pause_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_pause_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2291,6 +2634,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_purge_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_purge_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2448,6 +2795,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2595,6 +2946,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2822,6 +3177,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 @@ -2970,6 +3329,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 @@ -3127,6 +3490,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py index 1074c4de1723..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.18.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/client.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/client.py index 407424f66dda..0e7af2cf0d02 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/client.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -520,6 +522,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -3407,16 +3436,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3462,16 +3495,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/transports/rest.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/transports/rest.py index 56aadd77da3a..0ce9d449d728 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/transports/rest.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta2/services/cloud_tasks/transports/rest.py @@ -263,12 +263,33 @@ def pre_cancel_lease( def post_cancel_lease(self, response: task.Task) -> task.Task: """Post-rpc interceptor for cancel_lease - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_cancel_lease_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_cancel_lease` interceptor runs + before the `post_cancel_lease_with_metadata` interceptor. """ return response + def post_cancel_lease_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for cancel_lease + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_cancel_lease_with_metadata` + interceptor in new development instead of the `post_cancel_lease` interceptor. + When both interceptors are used, this `post_cancel_lease_with_metadata` interceptor runs after the + `post_cancel_lease` interceptor. The (possibly modified) response returned by + `post_cancel_lease` will be passed to + `post_cancel_lease_with_metadata`. + """ + return response, metadata + def pre_create_queue( self, request: cloudtasks.CreateQueueRequest, @@ -284,12 +305,35 @@ def pre_create_queue( def post_create_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for create_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_queue` interceptor runs + before the `post_create_queue_with_metadata` interceptor. """ return response + def post_create_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_queue_with_metadata` + interceptor in new development instead of the `post_create_queue` interceptor. + When both interceptors are used, this `post_create_queue_with_metadata` interceptor runs after the + `post_create_queue` interceptor. The (possibly modified) response returned by + `post_create_queue` will be passed to + `post_create_queue_with_metadata`. + """ + return response, metadata + def pre_create_task( self, request: cloudtasks.CreateTaskRequest, @@ -305,12 +349,33 @@ def pre_create_task( def post_create_task(self, response: gct_task.Task) -> gct_task.Task: """Post-rpc interceptor for create_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_task` interceptor runs + before the `post_create_task_with_metadata` interceptor. """ return response + def post_create_task_with_metadata( + self, response: gct_task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_task_with_metadata` + interceptor in new development instead of the `post_create_task` interceptor. + When both interceptors are used, this `post_create_task_with_metadata` interceptor runs after the + `post_create_task` interceptor. The (possibly modified) response returned by + `post_create_task` will be passed to + `post_create_task_with_metadata`. + """ + return response, metadata + def pre_delete_queue( self, request: cloudtasks.DeleteQueueRequest, @@ -352,12 +417,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.GetQueueRequest, @@ -373,12 +461,33 @@ def pre_get_queue( def post_get_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for get_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_queue` interceptor runs + before the `post_get_queue_with_metadata` interceptor. """ return response + def post_get_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_queue_with_metadata` + interceptor in new development instead of the `post_get_queue` interceptor. + When both interceptors are used, this `post_get_queue_with_metadata` interceptor runs after the + `post_get_queue` interceptor. The (possibly modified) response returned by + `post_get_queue` will be passed to + `post_get_queue_with_metadata`. + """ + return response, metadata + def pre_get_task( self, request: cloudtasks.GetTaskRequest, @@ -394,12 +503,33 @@ def pre_get_task( def post_get_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for get_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_task` interceptor runs + before the `post_get_task_with_metadata` interceptor. """ return response + def post_get_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_task_with_metadata` + interceptor in new development instead of the `post_get_task` interceptor. + When both interceptors are used, this `post_get_task_with_metadata` interceptor runs after the + `post_get_task` interceptor. The (possibly modified) response returned by + `post_get_task` will be passed to + `post_get_task_with_metadata`. + """ + return response, metadata + def pre_lease_tasks( self, request: cloudtasks.LeaseTasksRequest, @@ -417,12 +547,35 @@ def post_lease_tasks( ) -> cloudtasks.LeaseTasksResponse: """Post-rpc interceptor for lease_tasks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_lease_tasks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_lease_tasks` interceptor runs + before the `post_lease_tasks_with_metadata` interceptor. """ return response + def post_lease_tasks_with_metadata( + self, + response: cloudtasks.LeaseTasksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.LeaseTasksResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for lease_tasks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_lease_tasks_with_metadata` + interceptor in new development instead of the `post_lease_tasks` interceptor. + When both interceptors are used, this `post_lease_tasks_with_metadata` interceptor runs after the + `post_lease_tasks` interceptor. The (possibly modified) response returned by + `post_lease_tasks` will be passed to + `post_lease_tasks_with_metadata`. + """ + return response, metadata + def pre_list_queues( self, request: cloudtasks.ListQueuesRequest, @@ -440,12 +593,35 @@ def post_list_queues( ) -> cloudtasks.ListQueuesResponse: """Post-rpc interceptor for list_queues - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_queues_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_queues` interceptor runs + before the `post_list_queues_with_metadata` interceptor. """ return response + def post_list_queues_with_metadata( + self, + response: cloudtasks.ListQueuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListQueuesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_queues + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_queues_with_metadata` + interceptor in new development instead of the `post_list_queues` interceptor. + When both interceptors are used, this `post_list_queues_with_metadata` interceptor runs after the + `post_list_queues` interceptor. The (possibly modified) response returned by + `post_list_queues` will be passed to + `post_list_queues_with_metadata`. + """ + return response, metadata + def pre_list_tasks( self, request: cloudtasks.ListTasksRequest, @@ -463,12 +639,35 @@ def post_list_tasks( ) -> cloudtasks.ListTasksResponse: """Post-rpc interceptor for list_tasks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tasks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_tasks` interceptor runs + before the `post_list_tasks_with_metadata` interceptor. """ return response + def post_list_tasks_with_metadata( + self, + response: cloudtasks.ListTasksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListTasksResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tasks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_tasks_with_metadata` + interceptor in new development instead of the `post_list_tasks` interceptor. + When both interceptors are used, this `post_list_tasks_with_metadata` interceptor runs after the + `post_list_tasks` interceptor. The (possibly modified) response returned by + `post_list_tasks` will be passed to + `post_list_tasks_with_metadata`. + """ + return response, metadata + def pre_pause_queue( self, request: cloudtasks.PauseQueueRequest, @@ -484,12 +683,33 @@ def pre_pause_queue( def post_pause_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for pause_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_pause_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_pause_queue` interceptor runs + before the `post_pause_queue_with_metadata` interceptor. """ return response + def post_pause_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for pause_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_pause_queue_with_metadata` + interceptor in new development instead of the `post_pause_queue` interceptor. + When both interceptors are used, this `post_pause_queue_with_metadata` interceptor runs after the + `post_pause_queue` interceptor. The (possibly modified) response returned by + `post_pause_queue` will be passed to + `post_pause_queue_with_metadata`. + """ + return response, metadata + def pre_purge_queue( self, request: cloudtasks.PurgeQueueRequest, @@ -505,12 +725,33 @@ def pre_purge_queue( def post_purge_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for purge_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_purge_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_purge_queue` interceptor runs + before the `post_purge_queue_with_metadata` interceptor. """ return response + def post_purge_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for purge_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_purge_queue_with_metadata` + interceptor in new development instead of the `post_purge_queue` interceptor. + When both interceptors are used, this `post_purge_queue_with_metadata` interceptor runs after the + `post_purge_queue` interceptor. The (possibly modified) response returned by + `post_purge_queue` will be passed to + `post_purge_queue_with_metadata`. + """ + return response, metadata + def pre_renew_lease( self, request: cloudtasks.RenewLeaseRequest, @@ -526,12 +767,33 @@ def pre_renew_lease( def post_renew_lease(self, response: task.Task) -> task.Task: """Post-rpc interceptor for renew_lease - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_renew_lease_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_renew_lease` interceptor runs + before the `post_renew_lease_with_metadata` interceptor. """ return response + def post_renew_lease_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for renew_lease + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_renew_lease_with_metadata` + interceptor in new development instead of the `post_renew_lease` interceptor. + When both interceptors are used, this `post_renew_lease_with_metadata` interceptor runs after the + `post_renew_lease` interceptor. The (possibly modified) response returned by + `post_renew_lease` will be passed to + `post_renew_lease_with_metadata`. + """ + return response, metadata + def pre_resume_queue( self, request: cloudtasks.ResumeQueueRequest, @@ -547,12 +809,33 @@ def pre_resume_queue( def post_resume_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for resume_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_resume_queue` interceptor runs + before the `post_resume_queue_with_metadata` interceptor. """ return response + def post_resume_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_resume_queue_with_metadata` + interceptor in new development instead of the `post_resume_queue` interceptor. + When both interceptors are used, this `post_resume_queue_with_metadata` interceptor runs after the + `post_resume_queue` interceptor. The (possibly modified) response returned by + `post_resume_queue` will be passed to + `post_resume_queue_with_metadata`. + """ + return response, metadata + def pre_run_task( self, request: cloudtasks.RunTaskRequest, @@ -568,12 +851,33 @@ def pre_run_task( def post_run_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for run_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_run_task` interceptor runs + before the `post_run_task_with_metadata` interceptor. """ return response + def post_run_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_run_task_with_metadata` + interceptor in new development instead of the `post_run_task` interceptor. + When both interceptors are used, this `post_run_task_with_metadata` interceptor runs after the + `post_run_task` interceptor. The (possibly modified) response returned by + `post_run_task` will be passed to + `post_run_task_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -591,12 +895,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -617,12 +944,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.UpdateQueueRequest, @@ -638,12 +991,35 @@ def pre_update_queue( def post_update_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for update_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_update_queue` interceptor runs + before the `post_update_queue_with_metadata` interceptor. """ return response + def post_update_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_update_queue_with_metadata` + interceptor in new development instead of the `post_update_queue` interceptor. + When both interceptors are used, this `post_update_queue_with_metadata` interceptor runs after the + `post_update_queue` interceptor. The (possibly modified) response returned by + `post_update_queue` will be passed to + `post_update_queue_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1025,6 +1401,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_cancel_lease(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_cancel_lease_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1182,6 +1562,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1331,6 +1715,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1778,6 +2166,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 @@ -1927,6 +2319,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2068,6 +2464,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2219,6 +2619,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_lease_tasks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_lease_tasks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2364,6 +2768,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_queues(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_queues_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2509,6 +2917,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tasks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tasks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2664,6 +3076,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_pause_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_pause_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2819,6 +3235,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_purge_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_purge_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2968,6 +3388,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_renew_lease(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_renew_lease_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3125,6 +3549,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3272,6 +3700,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3499,6 +3931,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 @@ -3647,6 +4083,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 @@ -3804,6 +4244,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py index 1074c4de1723..558c8aab67c5 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.18.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/client.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/client.py index 0891ac4b9c63..6e8615cb13f9 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/client.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -520,6 +522,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -2777,16 +2806,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2832,16 +2865,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/transports/rest.py b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/transports/rest.py index 2a5f9869222d..d9f8451bc418 100644 --- a/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/transports/rest.py +++ b/packages/google-cloud-tasks/google/cloud/tasks_v2beta3/services/cloud_tasks/transports/rest.py @@ -217,12 +217,35 @@ def pre_create_queue( def post_create_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for create_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_queue` interceptor runs + before the `post_create_queue_with_metadata` interceptor. """ return response + def post_create_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_queue_with_metadata` + interceptor in new development instead of the `post_create_queue` interceptor. + When both interceptors are used, this `post_create_queue_with_metadata` interceptor runs after the + `post_create_queue` interceptor. The (possibly modified) response returned by + `post_create_queue` will be passed to + `post_create_queue_with_metadata`. + """ + return response, metadata + def pre_create_task( self, request: cloudtasks.CreateTaskRequest, @@ -238,12 +261,33 @@ def pre_create_task( def post_create_task(self, response: gct_task.Task) -> gct_task.Task: """Post-rpc interceptor for create_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_create_task` interceptor runs + before the `post_create_task_with_metadata` interceptor. """ return response + def post_create_task_with_metadata( + self, response: gct_task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[gct_task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_create_task_with_metadata` + interceptor in new development instead of the `post_create_task` interceptor. + When both interceptors are used, this `post_create_task_with_metadata` interceptor runs after the + `post_create_task` interceptor. The (possibly modified) response returned by + `post_create_task` will be passed to + `post_create_task_with_metadata`. + """ + return response, metadata + def pre_delete_queue( self, request: cloudtasks.DeleteQueueRequest, @@ -285,12 +329,35 @@ def pre_get_iam_policy( def post_get_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for get_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_iam_policy` interceptor runs + before the `post_get_iam_policy_with_metadata` interceptor. """ return response + def post_get_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.GetQueueRequest, @@ -306,12 +373,33 @@ def pre_get_queue( def post_get_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for get_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_queue` interceptor runs + before the `post_get_queue_with_metadata` interceptor. """ return response + def post_get_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_queue_with_metadata` + interceptor in new development instead of the `post_get_queue` interceptor. + When both interceptors are used, this `post_get_queue_with_metadata` interceptor runs after the + `post_get_queue` interceptor. The (possibly modified) response returned by + `post_get_queue` will be passed to + `post_get_queue_with_metadata`. + """ + return response, metadata + def pre_get_task( self, request: cloudtasks.GetTaskRequest, @@ -327,12 +415,33 @@ def pre_get_task( def post_get_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for get_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_get_task` interceptor runs + before the `post_get_task_with_metadata` interceptor. """ return response + def post_get_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_get_task_with_metadata` + interceptor in new development instead of the `post_get_task` interceptor. + When both interceptors are used, this `post_get_task_with_metadata` interceptor runs after the + `post_get_task` interceptor. The (possibly modified) response returned by + `post_get_task` will be passed to + `post_get_task_with_metadata`. + """ + return response, metadata + def pre_list_queues( self, request: cloudtasks.ListQueuesRequest, @@ -350,12 +459,35 @@ def post_list_queues( ) -> cloudtasks.ListQueuesResponse: """Post-rpc interceptor for list_queues - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_queues_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_queues` interceptor runs + before the `post_list_queues_with_metadata` interceptor. """ return response + def post_list_queues_with_metadata( + self, + response: cloudtasks.ListQueuesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListQueuesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_queues + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_queues_with_metadata` + interceptor in new development instead of the `post_list_queues` interceptor. + When both interceptors are used, this `post_list_queues_with_metadata` interceptor runs after the + `post_list_queues` interceptor. The (possibly modified) response returned by + `post_list_queues` will be passed to + `post_list_queues_with_metadata`. + """ + return response, metadata + def pre_list_tasks( self, request: cloudtasks.ListTasksRequest, @@ -373,12 +505,35 @@ def post_list_tasks( ) -> cloudtasks.ListTasksResponse: """Post-rpc interceptor for list_tasks - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_tasks_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_list_tasks` interceptor runs + before the `post_list_tasks_with_metadata` interceptor. """ return response + def post_list_tasks_with_metadata( + self, + response: cloudtasks.ListTasksResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloudtasks.ListTasksResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_tasks + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_list_tasks_with_metadata` + interceptor in new development instead of the `post_list_tasks` interceptor. + When both interceptors are used, this `post_list_tasks_with_metadata` interceptor runs after the + `post_list_tasks` interceptor. The (possibly modified) response returned by + `post_list_tasks` will be passed to + `post_list_tasks_with_metadata`. + """ + return response, metadata + def pre_pause_queue( self, request: cloudtasks.PauseQueueRequest, @@ -394,12 +549,33 @@ def pre_pause_queue( def post_pause_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for pause_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_pause_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_pause_queue` interceptor runs + before the `post_pause_queue_with_metadata` interceptor. """ return response + def post_pause_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for pause_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_pause_queue_with_metadata` + interceptor in new development instead of the `post_pause_queue` interceptor. + When both interceptors are used, this `post_pause_queue_with_metadata` interceptor runs after the + `post_pause_queue` interceptor. The (possibly modified) response returned by + `post_pause_queue` will be passed to + `post_pause_queue_with_metadata`. + """ + return response, metadata + def pre_purge_queue( self, request: cloudtasks.PurgeQueueRequest, @@ -415,12 +591,33 @@ def pre_purge_queue( def post_purge_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for purge_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_purge_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_purge_queue` interceptor runs + before the `post_purge_queue_with_metadata` interceptor. """ return response + def post_purge_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for purge_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_purge_queue_with_metadata` + interceptor in new development instead of the `post_purge_queue` interceptor. + When both interceptors are used, this `post_purge_queue_with_metadata` interceptor runs after the + `post_purge_queue` interceptor. The (possibly modified) response returned by + `post_purge_queue` will be passed to + `post_purge_queue_with_metadata`. + """ + return response, metadata + def pre_resume_queue( self, request: cloudtasks.ResumeQueueRequest, @@ -436,12 +633,33 @@ def pre_resume_queue( def post_resume_queue(self, response: queue.Queue) -> queue.Queue: """Post-rpc interceptor for resume_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_resume_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_resume_queue` interceptor runs + before the `post_resume_queue_with_metadata` interceptor. """ return response + def post_resume_queue_with_metadata( + self, response: queue.Queue, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for resume_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_resume_queue_with_metadata` + interceptor in new development instead of the `post_resume_queue` interceptor. + When both interceptors are used, this `post_resume_queue_with_metadata` interceptor runs after the + `post_resume_queue` interceptor. The (possibly modified) response returned by + `post_resume_queue` will be passed to + `post_resume_queue_with_metadata`. + """ + return response, metadata + def pre_run_task( self, request: cloudtasks.RunTaskRequest, @@ -457,12 +675,33 @@ def pre_run_task( def post_run_task(self, response: task.Task) -> task.Task: """Post-rpc interceptor for run_task - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_run_task_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_run_task` interceptor runs + before the `post_run_task_with_metadata` interceptor. """ return response + def post_run_task_with_metadata( + self, response: task.Task, metadata: Sequence[Tuple[str, Union[str, bytes]]] + ) -> Tuple[task.Task, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for run_task + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_run_task_with_metadata` + interceptor in new development instead of the `post_run_task` interceptor. + When both interceptors are used, this `post_run_task_with_metadata` interceptor runs after the + `post_run_task` interceptor. The (possibly modified) response returned by + `post_run_task` will be passed to + `post_run_task_with_metadata`. + """ + return response, metadata + def pre_set_iam_policy( self, request: iam_policy_pb2.SetIamPolicyRequest, @@ -480,12 +719,35 @@ def pre_set_iam_policy( def post_set_iam_policy(self, response: policy_pb2.Policy) -> policy_pb2.Policy: """Post-rpc interceptor for set_iam_policy - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_set_iam_policy_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_set_iam_policy` interceptor runs + before the `post_set_iam_policy_with_metadata` interceptor. """ return response + def post_set_iam_policy_with_metadata( + self, + response: policy_pb2.Policy, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[policy_pb2.Policy, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for set_iam_policy + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_set_iam_policy_with_metadata` + interceptor in new development instead of the `post_set_iam_policy` interceptor. + When both interceptors are used, this `post_set_iam_policy_with_metadata` interceptor runs after the + `post_set_iam_policy` interceptor. The (possibly modified) response returned by + `post_set_iam_policy` will be passed to + `post_set_iam_policy_with_metadata`. + """ + return response, metadata + def pre_test_iam_permissions( self, request: iam_policy_pb2.TestIamPermissionsRequest, @@ -506,12 +768,38 @@ def post_test_iam_permissions( ) -> iam_policy_pb2.TestIamPermissionsResponse: """Post-rpc interceptor for test_iam_permissions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_test_iam_permissions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_test_iam_permissions` interceptor runs + before the `post_test_iam_permissions_with_metadata` interceptor. """ return response + def post_test_iam_permissions_with_metadata( + self, + response: iam_policy_pb2.TestIamPermissionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + iam_policy_pb2.TestIamPermissionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for test_iam_permissions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks 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_queue( self, request: cloudtasks.UpdateQueueRequest, @@ -527,12 +815,35 @@ def pre_update_queue( def post_update_queue(self, response: gct_queue.Queue) -> gct_queue.Queue: """Post-rpc interceptor for update_queue - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_queue_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the CloudTasks server but before - it is returned to user code. + it is returned to user code. This `post_update_queue` interceptor runs + before the `post_update_queue_with_metadata` interceptor. """ return response + def post_update_queue_with_metadata( + self, + response: gct_queue.Queue, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[gct_queue.Queue, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_queue + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the CloudTasks server but before it is returned to user code. + + We recommend only using this `post_update_queue_with_metadata` + interceptor in new development instead of the `post_update_queue` interceptor. + When both interceptors are used, this `post_update_queue_with_metadata` interceptor runs after the + `post_update_queue` interceptor. The (possibly modified) response returned by + `post_update_queue` will be passed to + `post_update_queue_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -805,6 +1116,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -954,6 +1269,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1401,6 +1720,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 @@ -1550,6 +1873,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1691,6 +2018,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1836,6 +2167,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_queues(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_queues_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1981,6 +2316,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_tasks(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_tasks_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2136,6 +2475,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_pause_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_pause_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2291,6 +2634,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_purge_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_purge_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2448,6 +2795,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_resume_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_resume_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2595,6 +2946,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_run_task(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_run_task_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2822,6 +3177,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 @@ -2970,6 +3329,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 @@ -3127,6 +3490,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_queue(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_queue_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json index e8c1f2b305ab..a40f846fdcce 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.18.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json index 880a4be0f47f..2b3fcc2324d1 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.18.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json index 364127fb252f..c3812fadd698 100644 --- a/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json +++ b/packages/google-cloud-tasks/samples/generated_samples/snippet_metadata_google.cloud.tasks.v2beta3.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tasks", - "version": "2.18.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2/test_cloud_tasks.py b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2/test_cloud_tasks.py index 22ddb302807d..369d198e1c70 100644 --- a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2/test_cloud_tasks.py +++ b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2/test_cloud_tasks.py @@ -75,6 +75,13 @@ from google.cloud.tasks_v2.types import task from google.cloud.tasks_v2.types import task as gct_task +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -310,6 +317,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 = CloudTasksClient(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 = CloudTasksClient(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", [ @@ -10708,10 +10758,13 @@ def test_list_queues_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_queues" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_queues_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_queues" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListQueuesRequest.pb(cloudtasks.ListQueuesRequest()) transcode.return_value = { "method": "post", @@ -10735,6 +10788,7 @@ def test_list_queues_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListQueuesResponse() + post_with_metadata.return_value = cloudtasks.ListQueuesResponse(), metadata client.list_queues( request, @@ -10746,6 +10800,7 @@ def test_list_queues_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_queue_rest_bad_request(request_type=cloudtasks.GetQueueRequest): @@ -10830,10 +10885,13 @@ def test_get_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetQueueRequest.pb(cloudtasks.GetQueueRequest()) transcode.return_value = { "method": "post", @@ -10855,6 +10913,7 @@ def test_get_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.get_queue( request, @@ -10866,6 +10925,7 @@ def test_get_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_queue_rest_bad_request(request_type=cloudtasks.CreateQueueRequest): @@ -11041,10 +11101,13 @@ def test_create_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateQueueRequest.pb(cloudtasks.CreateQueueRequest()) transcode.return_value = { "method": "post", @@ -11066,6 +11129,7 @@ def test_create_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.create_queue( request, @@ -11077,6 +11141,7 @@ def test_create_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_queue_rest_bad_request(request_type=cloudtasks.UpdateQueueRequest): @@ -11256,10 +11321,13 @@ def test_update_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_update_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_update_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_update_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.UpdateQueueRequest.pb(cloudtasks.UpdateQueueRequest()) transcode.return_value = { "method": "post", @@ -11281,6 +11349,7 @@ def test_update_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.update_queue( request, @@ -11292,6 +11361,7 @@ def test_update_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_queue_rest_bad_request(request_type=cloudtasks.DeleteQueueRequest): @@ -11481,10 +11551,13 @@ def test_purge_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_purge_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_purge_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_purge_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PurgeQueueRequest.pb(cloudtasks.PurgeQueueRequest()) transcode.return_value = { "method": "post", @@ -11506,6 +11579,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.purge_queue( request, @@ -11517,6 +11591,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_pause_queue_rest_bad_request(request_type=cloudtasks.PauseQueueRequest): @@ -11601,10 +11676,13 @@ def test_pause_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_pause_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_pause_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_pause_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PauseQueueRequest.pb(cloudtasks.PauseQueueRequest()) transcode.return_value = { "method": "post", @@ -11626,6 +11704,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.pause_queue( request, @@ -11637,6 +11716,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_queue_rest_bad_request(request_type=cloudtasks.ResumeQueueRequest): @@ -11721,10 +11801,13 @@ def test_resume_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_resume_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_resume_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_resume_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ResumeQueueRequest.pb(cloudtasks.ResumeQueueRequest()) transcode.return_value = { "method": "post", @@ -11746,6 +11829,7 @@ def test_resume_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.resume_queue( request, @@ -11757,6 +11841,7 @@ def test_resume_queue_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( @@ -11840,10 +11925,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11865,6 +11953,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -11876,6 +11965,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -11959,10 +12049,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11984,6 +12077,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -11995,6 +12089,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( @@ -12076,10 +12171,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -12103,6 +12201,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -12114,6 +12216,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tasks_rest_bad_request(request_type=cloudtasks.ListTasksRequest): @@ -12196,10 +12299,13 @@ def test_list_tasks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_tasks" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_tasks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_tasks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListTasksRequest.pb(cloudtasks.ListTasksRequest()) transcode.return_value = { "method": "post", @@ -12223,6 +12329,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListTasksResponse() + post_with_metadata.return_value = cloudtasks.ListTasksResponse(), metadata client.list_tasks( request, @@ -12234,6 +12341,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_task_rest_bad_request(request_type=cloudtasks.GetTaskRequest): @@ -12326,10 +12434,13 @@ def test_get_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetTaskRequest.pb(cloudtasks.GetTaskRequest()) transcode.return_value = { "method": "post", @@ -12351,6 +12462,7 @@ def test_get_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.get_task( request, @@ -12362,6 +12474,7 @@ def test_get_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_task_rest_bad_request(request_type=cloudtasks.CreateTaskRequest): @@ -12450,10 +12563,13 @@ def test_create_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateTaskRequest.pb(cloudtasks.CreateTaskRequest()) transcode.return_value = { "method": "post", @@ -12475,6 +12591,7 @@ def test_create_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_task.Task() + post_with_metadata.return_value = gct_task.Task(), metadata client.create_task( request, @@ -12486,6 +12603,7 @@ def test_create_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_task_rest_bad_request(request_type=cloudtasks.DeleteTaskRequest): @@ -12687,10 +12805,13 @@ def test_run_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_run_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_run_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_run_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.RunTaskRequest.pb(cloudtasks.RunTaskRequest()) transcode.return_value = { "method": "post", @@ -12712,6 +12833,7 @@ def test_run_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.run_task( request, @@ -12723,6 +12845,7 @@ def test_run_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta2/test_cloud_tasks.py b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta2/test_cloud_tasks.py index abfc21d9a221..a651967a60d2 100644 --- a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta2/test_cloud_tasks.py +++ b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta2/test_cloud_tasks.py @@ -76,6 +76,13 @@ from google.cloud.tasks_v2beta2.types import task from google.cloud.tasks_v2beta2.types import task as gct_task +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -311,6 +318,49 @@ def test__get_universe_domain(): assert str(excinfo.value) == "Universe Domain cannot be an empty string." +@pytest.mark.parametrize( + "error_code,cred_info_json,show_cred_info", + [ + (401, CRED_INFO_JSON, True), + (403, CRED_INFO_JSON, True), + (404, CRED_INFO_JSON, True), + (500, CRED_INFO_JSON, False), + (401, None, False), + (403, None, False), + (404, None, False), + (500, None, False), + ], +) +def test__add_cred_info_for_auth_errors(error_code, cred_info_json, show_cred_info): + cred = mock.Mock(["get_cred_info"]) + cred.get_cred_info = mock.Mock(return_value=cred_info_json) + client = CloudTasksClient(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 = CloudTasksClient(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", [ @@ -13210,10 +13260,13 @@ def test_list_queues_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_queues" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_queues_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_queues" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListQueuesRequest.pb(cloudtasks.ListQueuesRequest()) transcode.return_value = { "method": "post", @@ -13237,6 +13290,7 @@ def test_list_queues_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListQueuesResponse() + post_with_metadata.return_value = cloudtasks.ListQueuesResponse(), metadata client.list_queues( request, @@ -13248,6 +13302,7 @@ def test_list_queues_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_queue_rest_bad_request(request_type=cloudtasks.GetQueueRequest): @@ -13332,10 +13387,13 @@ def test_get_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetQueueRequest.pb(cloudtasks.GetQueueRequest()) transcode.return_value = { "method": "post", @@ -13357,6 +13415,7 @@ def test_get_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.get_queue( request, @@ -13368,6 +13427,7 @@ def test_get_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_queue_rest_bad_request(request_type=cloudtasks.CreateQueueRequest): @@ -13577,10 +13637,13 @@ def test_create_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateQueueRequest.pb(cloudtasks.CreateQueueRequest()) transcode.return_value = { "method": "post", @@ -13602,6 +13665,7 @@ def test_create_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.create_queue( request, @@ -13613,6 +13677,7 @@ def test_create_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_queue_rest_bad_request(request_type=cloudtasks.UpdateQueueRequest): @@ -13826,10 +13891,13 @@ def test_update_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_update_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_update_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_update_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.UpdateQueueRequest.pb(cloudtasks.UpdateQueueRequest()) transcode.return_value = { "method": "post", @@ -13851,6 +13919,7 @@ def test_update_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.update_queue( request, @@ -13862,6 +13931,7 @@ def test_update_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_queue_rest_bad_request(request_type=cloudtasks.DeleteQueueRequest): @@ -14051,10 +14121,13 @@ def test_purge_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_purge_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_purge_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_purge_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PurgeQueueRequest.pb(cloudtasks.PurgeQueueRequest()) transcode.return_value = { "method": "post", @@ -14076,6 +14149,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.purge_queue( request, @@ -14087,6 +14161,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_pause_queue_rest_bad_request(request_type=cloudtasks.PauseQueueRequest): @@ -14171,10 +14246,13 @@ def test_pause_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_pause_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_pause_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_pause_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PauseQueueRequest.pb(cloudtasks.PauseQueueRequest()) transcode.return_value = { "method": "post", @@ -14196,6 +14274,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.pause_queue( request, @@ -14207,6 +14286,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_queue_rest_bad_request(request_type=cloudtasks.ResumeQueueRequest): @@ -14291,10 +14371,13 @@ def test_resume_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_resume_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_resume_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_resume_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ResumeQueueRequest.pb(cloudtasks.ResumeQueueRequest()) transcode.return_value = { "method": "post", @@ -14316,6 +14399,7 @@ def test_resume_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.resume_queue( request, @@ -14327,6 +14411,7 @@ def test_resume_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_upload_queue_yaml_rest_error(): @@ -14422,10 +14507,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14447,6 +14535,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -14458,6 +14547,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -14541,10 +14631,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -14566,6 +14659,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -14577,6 +14671,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( @@ -14658,10 +14753,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -14685,6 +14783,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -14696,6 +14798,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tasks_rest_bad_request(request_type=cloudtasks.ListTasksRequest): @@ -14778,10 +14881,13 @@ def test_list_tasks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_tasks" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_tasks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_tasks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListTasksRequest.pb(cloudtasks.ListTasksRequest()) transcode.return_value = { "method": "post", @@ -14805,6 +14911,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListTasksResponse() + post_with_metadata.return_value = cloudtasks.ListTasksResponse(), metadata client.list_tasks( request, @@ -14816,6 +14923,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_task_rest_bad_request(request_type=cloudtasks.GetTaskRequest): @@ -14904,10 +15012,13 @@ def test_get_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetTaskRequest.pb(cloudtasks.GetTaskRequest()) transcode.return_value = { "method": "post", @@ -14929,6 +15040,7 @@ def test_get_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.get_task( request, @@ -14940,6 +15052,7 @@ def test_get_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_task_rest_bad_request(request_type=cloudtasks.CreateTaskRequest): @@ -15024,10 +15137,13 @@ def test_create_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateTaskRequest.pb(cloudtasks.CreateTaskRequest()) transcode.return_value = { "method": "post", @@ -15049,6 +15165,7 @@ def test_create_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_task.Task() + post_with_metadata.return_value = gct_task.Task(), metadata client.create_task( request, @@ -15060,6 +15177,7 @@ def test_create_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_task_rest_bad_request(request_type=cloudtasks.DeleteTaskRequest): @@ -15248,10 +15366,13 @@ def test_lease_tasks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_lease_tasks" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_lease_tasks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_lease_tasks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.LeaseTasksRequest.pb(cloudtasks.LeaseTasksRequest()) transcode.return_value = { "method": "post", @@ -15275,6 +15396,7 @@ def test_lease_tasks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.LeaseTasksResponse() + post_with_metadata.return_value = cloudtasks.LeaseTasksResponse(), metadata client.lease_tasks( request, @@ -15286,6 +15408,7 @@ def test_lease_tasks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_acknowledge_task_rest_bad_request( @@ -15487,10 +15610,13 @@ def test_renew_lease_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_renew_lease" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_renew_lease_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_renew_lease" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.RenewLeaseRequest.pb(cloudtasks.RenewLeaseRequest()) transcode.return_value = { "method": "post", @@ -15512,6 +15638,7 @@ def test_renew_lease_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.renew_lease( request, @@ -15523,6 +15650,7 @@ def test_renew_lease_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_cancel_lease_rest_bad_request(request_type=cloudtasks.CancelLeaseRequest): @@ -15611,10 +15739,13 @@ def test_cancel_lease_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_cancel_lease" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_cancel_lease_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_cancel_lease" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CancelLeaseRequest.pb(cloudtasks.CancelLeaseRequest()) transcode.return_value = { "method": "post", @@ -15636,6 +15767,7 @@ def test_cancel_lease_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.cancel_lease( request, @@ -15647,6 +15779,7 @@ def test_cancel_lease_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_run_task_rest_bad_request(request_type=cloudtasks.RunTaskRequest): @@ -15735,10 +15868,13 @@ def test_run_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_run_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_run_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_run_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.RunTaskRequest.pb(cloudtasks.RunTaskRequest()) transcode.return_value = { "method": "post", @@ -15760,6 +15896,7 @@ def test_run_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.run_task( request, @@ -15771,6 +15908,7 @@ def test_run_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta3/test_cloud_tasks.py b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta3/test_cloud_tasks.py index 3fbd6ada1ed1..8a4e2c3caee6 100644 --- a/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta3/test_cloud_tasks.py +++ b/packages/google-cloud-tasks/tests/unit/gapic/tasks_v2beta3/test_cloud_tasks.py @@ -75,6 +75,13 @@ from google.cloud.tasks_v2beta3.types import task from google.cloud.tasks_v2beta3.types import task as gct_task +CRED_INFO_JSON = { + "credential_source": "/path/to/file", + "credential_type": "service account credentials", + "principal": "service-account@example.com", +} +CRED_INFO_STRING = json.dumps(CRED_INFO_JSON) + async def mock_async_gen(data, chunk_size=1): for i in range(0, len(data)): # pragma: NO COVER @@ -310,6 +317,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 = CloudTasksClient(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 = CloudTasksClient(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", [ @@ -10746,10 +10796,13 @@ def test_list_queues_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_queues" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_queues_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_queues" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListQueuesRequest.pb(cloudtasks.ListQueuesRequest()) transcode.return_value = { "method": "post", @@ -10773,6 +10826,7 @@ def test_list_queues_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListQueuesResponse() + post_with_metadata.return_value = cloudtasks.ListQueuesResponse(), metadata client.list_queues( request, @@ -10784,6 +10838,7 @@ def test_list_queues_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_queue_rest_bad_request(request_type=cloudtasks.GetQueueRequest): @@ -10870,10 +10925,13 @@ def test_get_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetQueueRequest.pb(cloudtasks.GetQueueRequest()) transcode.return_value = { "method": "post", @@ -10895,6 +10953,7 @@ def test_get_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.get_queue( request, @@ -10906,6 +10965,7 @@ def test_get_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_queue_rest_bad_request(request_type=cloudtasks.CreateQueueRequest): @@ -11117,10 +11177,13 @@ def test_create_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateQueueRequest.pb(cloudtasks.CreateQueueRequest()) transcode.return_value = { "method": "post", @@ -11142,6 +11205,7 @@ def test_create_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.create_queue( request, @@ -11153,6 +11217,7 @@ def test_create_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_queue_rest_bad_request(request_type=cloudtasks.UpdateQueueRequest): @@ -11368,10 +11433,13 @@ def test_update_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_update_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_update_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_update_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.UpdateQueueRequest.pb(cloudtasks.UpdateQueueRequest()) transcode.return_value = { "method": "post", @@ -11393,6 +11461,7 @@ def test_update_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_queue.Queue() + post_with_metadata.return_value = gct_queue.Queue(), metadata client.update_queue( request, @@ -11404,6 +11473,7 @@ def test_update_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_queue_rest_bad_request(request_type=cloudtasks.DeleteQueueRequest): @@ -11595,10 +11665,13 @@ def test_purge_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_purge_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_purge_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_purge_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PurgeQueueRequest.pb(cloudtasks.PurgeQueueRequest()) transcode.return_value = { "method": "post", @@ -11620,6 +11693,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.purge_queue( request, @@ -11631,6 +11705,7 @@ def test_purge_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_pause_queue_rest_bad_request(request_type=cloudtasks.PauseQueueRequest): @@ -11717,10 +11792,13 @@ def test_pause_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_pause_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_pause_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_pause_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.PauseQueueRequest.pb(cloudtasks.PauseQueueRequest()) transcode.return_value = { "method": "post", @@ -11742,6 +11820,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.pause_queue( request, @@ -11753,6 +11832,7 @@ def test_pause_queue_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_resume_queue_rest_bad_request(request_type=cloudtasks.ResumeQueueRequest): @@ -11839,10 +11919,13 @@ def test_resume_queue_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_resume_queue" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_resume_queue_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_resume_queue" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ResumeQueueRequest.pb(cloudtasks.ResumeQueueRequest()) transcode.return_value = { "method": "post", @@ -11864,6 +11947,7 @@ def test_resume_queue_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = queue.Queue() + post_with_metadata.return_value = queue.Queue(), metadata client.resume_queue( request, @@ -11875,6 +11959,7 @@ def test_resume_queue_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( @@ -11958,10 +12043,13 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.GetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -11983,6 +12071,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.get_iam_policy( request, @@ -11994,6 +12083,7 @@ def test_get_iam_policy_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_set_iam_policy_rest_bad_request( @@ -12077,10 +12167,13 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_set_iam_policy" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_set_iam_policy_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_set_iam_policy" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.SetIamPolicyRequest() transcode.return_value = { "method": "post", @@ -12102,6 +12195,7 @@ def test_set_iam_policy_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = policy_pb2.Policy() + post_with_metadata.return_value = policy_pb2.Policy(), metadata client.set_iam_policy( request, @@ -12113,6 +12207,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( @@ -12194,10 +12289,13 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_test_iam_permissions" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_test_iam_permissions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_test_iam_permissions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = iam_policy_pb2.TestIamPermissionsRequest() transcode.return_value = { "method": "post", @@ -12221,6 +12319,10 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = iam_policy_pb2.TestIamPermissionsResponse() + post_with_metadata.return_value = ( + iam_policy_pb2.TestIamPermissionsResponse(), + metadata, + ) client.test_iam_permissions( request, @@ -12232,6 +12334,7 @@ def test_test_iam_permissions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_tasks_rest_bad_request(request_type=cloudtasks.ListTasksRequest): @@ -12314,10 +12417,13 @@ def test_list_tasks_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_list_tasks" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_list_tasks_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_list_tasks" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.ListTasksRequest.pb(cloudtasks.ListTasksRequest()) transcode.return_value = { "method": "post", @@ -12341,6 +12447,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloudtasks.ListTasksResponse() + post_with_metadata.return_value = cloudtasks.ListTasksResponse(), metadata client.list_tasks( request, @@ -12352,6 +12459,7 @@ def test_list_tasks_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_task_rest_bad_request(request_type=cloudtasks.GetTaskRequest): @@ -12444,10 +12552,13 @@ def test_get_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_get_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_get_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_get_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.GetTaskRequest.pb(cloudtasks.GetTaskRequest()) transcode.return_value = { "method": "post", @@ -12469,6 +12580,7 @@ def test_get_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.get_task( request, @@ -12480,6 +12592,7 @@ def test_get_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_task_rest_bad_request(request_type=cloudtasks.CreateTaskRequest): @@ -12568,10 +12681,13 @@ def test_create_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_create_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_create_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_create_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.CreateTaskRequest.pb(cloudtasks.CreateTaskRequest()) transcode.return_value = { "method": "post", @@ -12593,6 +12709,7 @@ def test_create_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = gct_task.Task() + post_with_metadata.return_value = gct_task.Task(), metadata client.create_task( request, @@ -12604,6 +12721,7 @@ def test_create_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_task_rest_bad_request(request_type=cloudtasks.DeleteTaskRequest): @@ -12805,10 +12923,13 @@ def test_run_task_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.CloudTasksRestInterceptor, "post_run_task" ) as post, mock.patch.object( + transports.CloudTasksRestInterceptor, "post_run_task_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.CloudTasksRestInterceptor, "pre_run_task" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloudtasks.RunTaskRequest.pb(cloudtasks.RunTaskRequest()) transcode.return_value = { "method": "post", @@ -12830,6 +12951,7 @@ def test_run_task_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = task.Task() + post_with_metadata.return_value = task.Task(), metadata client.run_task( request, @@ -12841,6 +12963,7 @@ def test_run_task_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation/gapic_version.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation/gapic_version.py index c1557c8c086b..558c8aab67c5 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation/gapic_version.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.8" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/gapic_version.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/gapic_version.py index c1557c8c086b..558c8aab67c5 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/gapic_version.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.8" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/client.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/client.py index 0d42ffdf61ba..9386d5880242 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/client.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -615,6 +617,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -5161,16 +5190,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -5216,16 +5249,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -5382,16 +5419,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -5437,16 +5478,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/transports/rest.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/transports/rest.py index d6899346ef07..c85c94bb86d8 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/transports/rest.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1/services/telco_automation/transports/rest.py @@ -376,12 +376,35 @@ def post_apply_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for apply_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_apply_deployment` interceptor runs + before the `post_apply_deployment_with_metadata` interceptor. """ return response + def post_apply_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for apply_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_apply_deployment_with_metadata` + interceptor in new development instead of the `post_apply_deployment` interceptor. + When both interceptors are used, this `post_apply_deployment_with_metadata` interceptor runs after the + `post_apply_deployment` interceptor. The (possibly modified) response returned by + `post_apply_deployment` will be passed to + `post_apply_deployment_with_metadata`. + """ + return response, metadata + def pre_apply_hydrated_deployment( self, request: telcoautomation.ApplyHydratedDeploymentRequest, @@ -402,12 +425,37 @@ def post_apply_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for apply_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_apply_hydrated_deployment` interceptor runs + before the `post_apply_hydrated_deployment_with_metadata` interceptor. """ return response + def post_apply_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for apply_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_apply_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_apply_hydrated_deployment` interceptor. + When both interceptors are used, this `post_apply_hydrated_deployment_with_metadata` interceptor runs after the + `post_apply_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_apply_hydrated_deployment` will be passed to + `post_apply_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_approve_blueprint( self, request: telcoautomation.ApproveBlueprintRequest, @@ -427,12 +475,35 @@ def post_approve_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for approve_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_approve_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_approve_blueprint` interceptor runs + before the `post_approve_blueprint_with_metadata` interceptor. """ return response + def post_approve_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for approve_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_approve_blueprint_with_metadata` + interceptor in new development instead of the `post_approve_blueprint` interceptor. + When both interceptors are used, this `post_approve_blueprint_with_metadata` interceptor runs after the + `post_approve_blueprint` interceptor. The (possibly modified) response returned by + `post_approve_blueprint` will be passed to + `post_approve_blueprint_with_metadata`. + """ + return response, metadata + def pre_compute_deployment_status( self, request: telcoautomation.ComputeDeploymentStatusRequest, @@ -453,12 +524,38 @@ def post_compute_deployment_status( ) -> telcoautomation.ComputeDeploymentStatusResponse: """Post-rpc interceptor for compute_deployment_status - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_compute_deployment_status_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_compute_deployment_status` interceptor runs + before the `post_compute_deployment_status_with_metadata` interceptor. """ return response + def post_compute_deployment_status_with_metadata( + self, + response: telcoautomation.ComputeDeploymentStatusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ComputeDeploymentStatusResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for compute_deployment_status + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_compute_deployment_status_with_metadata` + interceptor in new development instead of the `post_compute_deployment_status` interceptor. + When both interceptors are used, this `post_compute_deployment_status_with_metadata` interceptor runs after the + `post_compute_deployment_status` interceptor. The (possibly modified) response returned by + `post_compute_deployment_status` will be passed to + `post_compute_deployment_status_with_metadata`. + """ + return response, metadata + def pre_create_blueprint( self, request: telcoautomation.CreateBlueprintRequest, @@ -478,12 +575,35 @@ def post_create_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for create_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_blueprint` interceptor runs + before the `post_create_blueprint_with_metadata` interceptor. """ return response + def post_create_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_blueprint_with_metadata` + interceptor in new development instead of the `post_create_blueprint` interceptor. + When both interceptors are used, this `post_create_blueprint_with_metadata` interceptor runs after the + `post_create_blueprint` interceptor. The (possibly modified) response returned by + `post_create_blueprint` will be passed to + `post_create_blueprint_with_metadata`. + """ + return response, metadata + def pre_create_deployment( self, request: telcoautomation.CreateDeploymentRequest, @@ -503,12 +623,35 @@ def post_create_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for create_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_deployment` interceptor runs + before the `post_create_deployment_with_metadata` interceptor. """ return response + def post_create_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_deployment_with_metadata` + interceptor in new development instead of the `post_create_deployment` interceptor. + When both interceptors are used, this `post_create_deployment_with_metadata` interceptor runs after the + `post_create_deployment` interceptor. The (possibly modified) response returned by + `post_create_deployment` will be passed to + `post_create_deployment_with_metadata`. + """ + return response, metadata + def pre_create_edge_slm( self, request: telcoautomation.CreateEdgeSlmRequest, @@ -528,12 +671,35 @@ def post_create_edge_slm( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_edge_slm` interceptor runs + before the `post_create_edge_slm_with_metadata` interceptor. """ return response + def post_create_edge_slm_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_edge_slm_with_metadata` + interceptor in new development instead of the `post_create_edge_slm` interceptor. + When both interceptors are used, this `post_create_edge_slm_with_metadata` interceptor runs after the + `post_create_edge_slm` interceptor. The (possibly modified) response returned by + `post_create_edge_slm` will be passed to + `post_create_edge_slm_with_metadata`. + """ + return response, metadata + def pre_create_orchestration_cluster( self, request: telcoautomation.CreateOrchestrationClusterRequest, @@ -554,12 +720,35 @@ def post_create_orchestration_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_orchestration_cluster` interceptor runs + before the `post_create_orchestration_cluster_with_metadata` interceptor. """ return response + def post_create_orchestration_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_create_orchestration_cluster` interceptor. + When both interceptors are used, this `post_create_orchestration_cluster_with_metadata` interceptor runs after the + `post_create_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_create_orchestration_cluster` will be passed to + `post_create_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_blueprint( self, request: telcoautomation.DeleteBlueprintRequest, @@ -593,12 +782,35 @@ def post_delete_edge_slm( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_delete_edge_slm` interceptor runs + before the `post_delete_edge_slm_with_metadata` interceptor. """ return response + def post_delete_edge_slm_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_delete_edge_slm_with_metadata` + interceptor in new development instead of the `post_delete_edge_slm` interceptor. + When both interceptors are used, this `post_delete_edge_slm_with_metadata` interceptor runs after the + `post_delete_edge_slm` interceptor. The (possibly modified) response returned by + `post_delete_edge_slm` will be passed to + `post_delete_edge_slm_with_metadata`. + """ + return response, metadata + def pre_delete_orchestration_cluster( self, request: telcoautomation.DeleteOrchestrationClusterRequest, @@ -619,12 +831,35 @@ def post_delete_orchestration_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_delete_orchestration_cluster` interceptor runs + before the `post_delete_orchestration_cluster_with_metadata` interceptor. """ return response + def post_delete_orchestration_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_delete_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_delete_orchestration_cluster` interceptor. + When both interceptors are used, this `post_delete_orchestration_cluster_with_metadata` interceptor runs after the + `post_delete_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_delete_orchestration_cluster` will be passed to + `post_delete_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_discard_blueprint_changes( self, request: telcoautomation.DiscardBlueprintChangesRequest, @@ -645,12 +880,38 @@ def post_discard_blueprint_changes( ) -> telcoautomation.DiscardBlueprintChangesResponse: """Post-rpc interceptor for discard_blueprint_changes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_discard_blueprint_changes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_discard_blueprint_changes` interceptor runs + before the `post_discard_blueprint_changes_with_metadata` interceptor. """ return response + def post_discard_blueprint_changes_with_metadata( + self, + response: telcoautomation.DiscardBlueprintChangesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.DiscardBlueprintChangesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for discard_blueprint_changes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_discard_blueprint_changes_with_metadata` + interceptor in new development instead of the `post_discard_blueprint_changes` interceptor. + When both interceptors are used, this `post_discard_blueprint_changes_with_metadata` interceptor runs after the + `post_discard_blueprint_changes` interceptor. The (possibly modified) response returned by + `post_discard_blueprint_changes` will be passed to + `post_discard_blueprint_changes_with_metadata`. + """ + return response, metadata + def pre_discard_deployment_changes( self, request: telcoautomation.DiscardDeploymentChangesRequest, @@ -671,12 +932,38 @@ def post_discard_deployment_changes( ) -> telcoautomation.DiscardDeploymentChangesResponse: """Post-rpc interceptor for discard_deployment_changes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_discard_deployment_changes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_discard_deployment_changes` interceptor runs + before the `post_discard_deployment_changes_with_metadata` interceptor. """ return response + def post_discard_deployment_changes_with_metadata( + self, + response: telcoautomation.DiscardDeploymentChangesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.DiscardDeploymentChangesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for discard_deployment_changes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_discard_deployment_changes_with_metadata` + interceptor in new development instead of the `post_discard_deployment_changes` interceptor. + When both interceptors are used, this `post_discard_deployment_changes_with_metadata` interceptor runs after the + `post_discard_deployment_changes` interceptor. The (possibly modified) response returned by + `post_discard_deployment_changes` will be passed to + `post_discard_deployment_changes_with_metadata`. + """ + return response, metadata + def pre_get_blueprint( self, request: telcoautomation.GetBlueprintRequest, @@ -696,12 +983,35 @@ def post_get_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for get_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_blueprint` interceptor runs + before the `post_get_blueprint_with_metadata` interceptor. """ return response + def post_get_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_blueprint_with_metadata` + interceptor in new development instead of the `post_get_blueprint` interceptor. + When both interceptors are used, this `post_get_blueprint_with_metadata` interceptor runs after the + `post_get_blueprint` interceptor. The (possibly modified) response returned by + `post_get_blueprint` will be passed to + `post_get_blueprint_with_metadata`. + """ + return response, metadata + def pre_get_deployment( self, request: telcoautomation.GetDeploymentRequest, @@ -721,12 +1031,35 @@ def post_get_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for get_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_deployment` interceptor runs + before the `post_get_deployment_with_metadata` interceptor. """ return response + def post_get_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_deployment_with_metadata` + interceptor in new development instead of the `post_get_deployment` interceptor. + When both interceptors are used, this `post_get_deployment_with_metadata` interceptor runs after the + `post_get_deployment` interceptor. The (possibly modified) response returned by + `post_get_deployment` will be passed to + `post_get_deployment_with_metadata`. + """ + return response, metadata + def pre_get_edge_slm( self, request: telcoautomation.GetEdgeSlmRequest, @@ -746,12 +1079,35 @@ def post_get_edge_slm( ) -> telcoautomation.EdgeSlm: """Post-rpc interceptor for get_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_edge_slm` interceptor runs + before the `post_get_edge_slm_with_metadata` interceptor. """ return response + def post_get_edge_slm_with_metadata( + self, + response: telcoautomation.EdgeSlm, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.EdgeSlm, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_edge_slm_with_metadata` + interceptor in new development instead of the `post_get_edge_slm` interceptor. + When both interceptors are used, this `post_get_edge_slm_with_metadata` interceptor runs after the + `post_get_edge_slm` interceptor. The (possibly modified) response returned by + `post_get_edge_slm` will be passed to + `post_get_edge_slm_with_metadata`. + """ + return response, metadata + def pre_get_hydrated_deployment( self, request: telcoautomation.GetHydratedDeploymentRequest, @@ -772,12 +1128,37 @@ def post_get_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for get_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_hydrated_deployment` interceptor runs + before the `post_get_hydrated_deployment_with_metadata` interceptor. """ return response + def post_get_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_get_hydrated_deployment` interceptor. + When both interceptors are used, this `post_get_hydrated_deployment_with_metadata` interceptor runs after the + `post_get_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_get_hydrated_deployment` will be passed to + `post_get_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_get_orchestration_cluster( self, request: telcoautomation.GetOrchestrationClusterRequest, @@ -798,12 +1179,37 @@ def post_get_orchestration_cluster( ) -> telcoautomation.OrchestrationCluster: """Post-rpc interceptor for get_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_orchestration_cluster` interceptor runs + before the `post_get_orchestration_cluster_with_metadata` interceptor. """ return response + def post_get_orchestration_cluster_with_metadata( + self, + response: telcoautomation.OrchestrationCluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.OrchestrationCluster, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_get_orchestration_cluster` interceptor. + When both interceptors are used, this `post_get_orchestration_cluster_with_metadata` interceptor runs after the + `post_get_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_get_orchestration_cluster` will be passed to + `post_get_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_get_public_blueprint( self, request: telcoautomation.GetPublicBlueprintRequest, @@ -824,12 +1230,37 @@ def post_get_public_blueprint( ) -> telcoautomation.PublicBlueprint: """Post-rpc interceptor for get_public_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_public_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_public_blueprint` interceptor runs + before the `post_get_public_blueprint_with_metadata` interceptor. """ return response + def post_get_public_blueprint_with_metadata( + self, + response: telcoautomation.PublicBlueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.PublicBlueprint, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_public_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_public_blueprint_with_metadata` + interceptor in new development instead of the `post_get_public_blueprint` interceptor. + When both interceptors are used, this `post_get_public_blueprint_with_metadata` interceptor runs after the + `post_get_public_blueprint` interceptor. The (possibly modified) response returned by + `post_get_public_blueprint` will be passed to + `post_get_public_blueprint_with_metadata`. + """ + return response, metadata + def pre_list_blueprint_revisions( self, request: telcoautomation.ListBlueprintRevisionsRequest, @@ -850,12 +1281,38 @@ def post_list_blueprint_revisions( ) -> telcoautomation.ListBlueprintRevisionsResponse: """Post-rpc interceptor for list_blueprint_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_blueprint_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_blueprint_revisions` interceptor runs + before the `post_list_blueprint_revisions_with_metadata` interceptor. """ return response + def post_list_blueprint_revisions_with_metadata( + self, + response: telcoautomation.ListBlueprintRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListBlueprintRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_blueprint_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_blueprint_revisions_with_metadata` + interceptor in new development instead of the `post_list_blueprint_revisions` interceptor. + When both interceptors are used, this `post_list_blueprint_revisions_with_metadata` interceptor runs after the + `post_list_blueprint_revisions` interceptor. The (possibly modified) response returned by + `post_list_blueprint_revisions` will be passed to + `post_list_blueprint_revisions_with_metadata`. + """ + return response, metadata + def pre_list_blueprints( self, request: telcoautomation.ListBlueprintsRequest, @@ -875,12 +1332,37 @@ def post_list_blueprints( ) -> telcoautomation.ListBlueprintsResponse: """Post-rpc interceptor for list_blueprints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_blueprints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_blueprints` interceptor runs + before the `post_list_blueprints_with_metadata` interceptor. """ return response + def post_list_blueprints_with_metadata( + self, + response: telcoautomation.ListBlueprintsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListBlueprintsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_blueprints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_blueprints_with_metadata` + interceptor in new development instead of the `post_list_blueprints` interceptor. + When both interceptors are used, this `post_list_blueprints_with_metadata` interceptor runs after the + `post_list_blueprints` interceptor. The (possibly modified) response returned by + `post_list_blueprints` will be passed to + `post_list_blueprints_with_metadata`. + """ + return response, metadata + def pre_list_deployment_revisions( self, request: telcoautomation.ListDeploymentRevisionsRequest, @@ -901,12 +1383,38 @@ def post_list_deployment_revisions( ) -> telcoautomation.ListDeploymentRevisionsResponse: """Post-rpc interceptor for list_deployment_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_deployment_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_deployment_revisions` interceptor runs + before the `post_list_deployment_revisions_with_metadata` interceptor. """ return response + def post_list_deployment_revisions_with_metadata( + self, + response: telcoautomation.ListDeploymentRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListDeploymentRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_deployment_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_deployment_revisions_with_metadata` + interceptor in new development instead of the `post_list_deployment_revisions` interceptor. + When both interceptors are used, this `post_list_deployment_revisions_with_metadata` interceptor runs after the + `post_list_deployment_revisions` interceptor. The (possibly modified) response returned by + `post_list_deployment_revisions` will be passed to + `post_list_deployment_revisions_with_metadata`. + """ + return response, metadata + def pre_list_deployments( self, request: telcoautomation.ListDeploymentsRequest, @@ -926,12 +1434,37 @@ def post_list_deployments( ) -> telcoautomation.ListDeploymentsResponse: """Post-rpc interceptor for list_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_deployments` interceptor runs + before the `post_list_deployments_with_metadata` interceptor. """ return response + def post_list_deployments_with_metadata( + self, + response: telcoautomation.ListDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListDeploymentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_deployments_with_metadata` + interceptor in new development instead of the `post_list_deployments` interceptor. + When both interceptors are used, this `post_list_deployments_with_metadata` interceptor runs after the + `post_list_deployments` interceptor. The (possibly modified) response returned by + `post_list_deployments` will be passed to + `post_list_deployments_with_metadata`. + """ + return response, metadata + def pre_list_edge_slms( self, request: telcoautomation.ListEdgeSlmsRequest, @@ -951,12 +1484,37 @@ def post_list_edge_slms( ) -> telcoautomation.ListEdgeSlmsResponse: """Post-rpc interceptor for list_edge_slms - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_edge_slms_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_edge_slms` interceptor runs + before the `post_list_edge_slms_with_metadata` interceptor. """ return response + def post_list_edge_slms_with_metadata( + self, + response: telcoautomation.ListEdgeSlmsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListEdgeSlmsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_edge_slms + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_edge_slms_with_metadata` + interceptor in new development instead of the `post_list_edge_slms` interceptor. + When both interceptors are used, this `post_list_edge_slms_with_metadata` interceptor runs after the + `post_list_edge_slms` interceptor. The (possibly modified) response returned by + `post_list_edge_slms` will be passed to + `post_list_edge_slms_with_metadata`. + """ + return response, metadata + def pre_list_hydrated_deployments( self, request: telcoautomation.ListHydratedDeploymentsRequest, @@ -977,12 +1535,38 @@ def post_list_hydrated_deployments( ) -> telcoautomation.ListHydratedDeploymentsResponse: """Post-rpc interceptor for list_hydrated_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_hydrated_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_hydrated_deployments` interceptor runs + before the `post_list_hydrated_deployments_with_metadata` interceptor. """ return response + def post_list_hydrated_deployments_with_metadata( + self, + response: telcoautomation.ListHydratedDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListHydratedDeploymentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_hydrated_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_hydrated_deployments_with_metadata` + interceptor in new development instead of the `post_list_hydrated_deployments` interceptor. + When both interceptors are used, this `post_list_hydrated_deployments_with_metadata` interceptor runs after the + `post_list_hydrated_deployments` interceptor. The (possibly modified) response returned by + `post_list_hydrated_deployments` will be passed to + `post_list_hydrated_deployments_with_metadata`. + """ + return response, metadata + def pre_list_orchestration_clusters( self, request: telcoautomation.ListOrchestrationClustersRequest, @@ -1003,12 +1587,38 @@ def post_list_orchestration_clusters( ) -> telcoautomation.ListOrchestrationClustersResponse: """Post-rpc interceptor for list_orchestration_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_orchestration_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_orchestration_clusters` interceptor runs + before the `post_list_orchestration_clusters_with_metadata` interceptor. """ return response + def post_list_orchestration_clusters_with_metadata( + self, + response: telcoautomation.ListOrchestrationClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListOrchestrationClustersResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_orchestration_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_orchestration_clusters_with_metadata` + interceptor in new development instead of the `post_list_orchestration_clusters` interceptor. + When both interceptors are used, this `post_list_orchestration_clusters_with_metadata` interceptor runs after the + `post_list_orchestration_clusters` interceptor. The (possibly modified) response returned by + `post_list_orchestration_clusters` will be passed to + `post_list_orchestration_clusters_with_metadata`. + """ + return response, metadata + def pre_list_public_blueprints( self, request: telcoautomation.ListPublicBlueprintsRequest, @@ -1029,12 +1639,38 @@ def post_list_public_blueprints( ) -> telcoautomation.ListPublicBlueprintsResponse: """Post-rpc interceptor for list_public_blueprints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_public_blueprints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_public_blueprints` interceptor runs + before the `post_list_public_blueprints_with_metadata` interceptor. """ return response + def post_list_public_blueprints_with_metadata( + self, + response: telcoautomation.ListPublicBlueprintsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListPublicBlueprintsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_public_blueprints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_public_blueprints_with_metadata` + interceptor in new development instead of the `post_list_public_blueprints` interceptor. + When both interceptors are used, this `post_list_public_blueprints_with_metadata` interceptor runs after the + `post_list_public_blueprints` interceptor. The (possibly modified) response returned by + `post_list_public_blueprints` will be passed to + `post_list_public_blueprints_with_metadata`. + """ + return response, metadata + def pre_propose_blueprint( self, request: telcoautomation.ProposeBlueprintRequest, @@ -1054,12 +1690,35 @@ def post_propose_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for propose_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_propose_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_propose_blueprint` interceptor runs + before the `post_propose_blueprint_with_metadata` interceptor. """ return response + def post_propose_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for propose_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_propose_blueprint_with_metadata` + interceptor in new development instead of the `post_propose_blueprint` interceptor. + When both interceptors are used, this `post_propose_blueprint_with_metadata` interceptor runs after the + `post_propose_blueprint` interceptor. The (possibly modified) response returned by + `post_propose_blueprint` will be passed to + `post_propose_blueprint_with_metadata`. + """ + return response, metadata + def pre_reject_blueprint( self, request: telcoautomation.RejectBlueprintRequest, @@ -1079,12 +1738,35 @@ def post_reject_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for reject_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reject_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_reject_blueprint` interceptor runs + before the `post_reject_blueprint_with_metadata` interceptor. """ return response + def post_reject_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for reject_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_reject_blueprint_with_metadata` + interceptor in new development instead of the `post_reject_blueprint` interceptor. + When both interceptors are used, this `post_reject_blueprint_with_metadata` interceptor runs after the + `post_reject_blueprint` interceptor. The (possibly modified) response returned by + `post_reject_blueprint` will be passed to + `post_reject_blueprint_with_metadata`. + """ + return response, metadata + def pre_remove_deployment( self, request: telcoautomation.RemoveDeploymentRequest, @@ -1119,12 +1801,35 @@ def post_rollback_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for rollback_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_rollback_deployment` interceptor runs + before the `post_rollback_deployment_with_metadata` interceptor. """ return response + def post_rollback_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_rollback_deployment_with_metadata` + interceptor in new development instead of the `post_rollback_deployment` interceptor. + When both interceptors are used, this `post_rollback_deployment_with_metadata` interceptor runs after the + `post_rollback_deployment` interceptor. The (possibly modified) response returned by + `post_rollback_deployment` will be passed to + `post_rollback_deployment_with_metadata`. + """ + return response, metadata + def pre_search_blueprint_revisions( self, request: telcoautomation.SearchBlueprintRevisionsRequest, @@ -1145,12 +1850,38 @@ def post_search_blueprint_revisions( ) -> telcoautomation.SearchBlueprintRevisionsResponse: """Post-rpc interceptor for search_blueprint_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_blueprint_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_search_blueprint_revisions` interceptor runs + before the `post_search_blueprint_revisions_with_metadata` interceptor. """ return response + def post_search_blueprint_revisions_with_metadata( + self, + response: telcoautomation.SearchBlueprintRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.SearchBlueprintRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_blueprint_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_search_blueprint_revisions_with_metadata` + interceptor in new development instead of the `post_search_blueprint_revisions` interceptor. + When both interceptors are used, this `post_search_blueprint_revisions_with_metadata` interceptor runs after the + `post_search_blueprint_revisions` interceptor. The (possibly modified) response returned by + `post_search_blueprint_revisions` will be passed to + `post_search_blueprint_revisions_with_metadata`. + """ + return response, metadata + def pre_search_deployment_revisions( self, request: telcoautomation.SearchDeploymentRevisionsRequest, @@ -1171,12 +1902,38 @@ def post_search_deployment_revisions( ) -> telcoautomation.SearchDeploymentRevisionsResponse: """Post-rpc interceptor for search_deployment_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_deployment_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_search_deployment_revisions` interceptor runs + before the `post_search_deployment_revisions_with_metadata` interceptor. """ return response + def post_search_deployment_revisions_with_metadata( + self, + response: telcoautomation.SearchDeploymentRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.SearchDeploymentRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_deployment_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_search_deployment_revisions_with_metadata` + interceptor in new development instead of the `post_search_deployment_revisions` interceptor. + When both interceptors are used, this `post_search_deployment_revisions_with_metadata` interceptor runs after the + `post_search_deployment_revisions` interceptor. The (possibly modified) response returned by + `post_search_deployment_revisions` will be passed to + `post_search_deployment_revisions_with_metadata`. + """ + return response, metadata + def pre_update_blueprint( self, request: telcoautomation.UpdateBlueprintRequest, @@ -1196,12 +1953,35 @@ def post_update_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for update_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_blueprint` interceptor runs + before the `post_update_blueprint_with_metadata` interceptor. """ return response + def post_update_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_blueprint_with_metadata` + interceptor in new development instead of the `post_update_blueprint` interceptor. + When both interceptors are used, this `post_update_blueprint_with_metadata` interceptor runs after the + `post_update_blueprint` interceptor. The (possibly modified) response returned by + `post_update_blueprint` will be passed to + `post_update_blueprint_with_metadata`. + """ + return response, metadata + def pre_update_deployment( self, request: telcoautomation.UpdateDeploymentRequest, @@ -1221,12 +2001,35 @@ def post_update_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for update_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_deployment` interceptor runs + before the `post_update_deployment_with_metadata` interceptor. """ return response + def post_update_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_deployment_with_metadata` + interceptor in new development instead of the `post_update_deployment` interceptor. + When both interceptors are used, this `post_update_deployment_with_metadata` interceptor runs after the + `post_update_deployment` interceptor. The (possibly modified) response returned by + `post_update_deployment` will be passed to + `post_update_deployment_with_metadata`. + """ + return response, metadata + def pre_update_hydrated_deployment( self, request: telcoautomation.UpdateHydratedDeploymentRequest, @@ -1247,12 +2050,37 @@ def post_update_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for update_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_hydrated_deployment` interceptor runs + before the `post_update_hydrated_deployment_with_metadata` interceptor. """ return response + def post_update_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_update_hydrated_deployment` interceptor. + When both interceptors are used, this `post_update_hydrated_deployment_with_metadata` interceptor runs after the + `post_update_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_update_hydrated_deployment` will be passed to + `post_update_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1676,6 +2504,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1832,6 +2664,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1994,6 +2830,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_approve_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_approve_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2139,6 +2979,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_compute_deployment_status(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_compute_deployment_status_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2303,6 +3147,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2456,6 +3304,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2603,6 +3455,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2757,6 +3613,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3006,6 +3866,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3154,6 +4018,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3305,6 +4173,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_discard_blueprint_changes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_discard_blueprint_changes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3461,6 +4333,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_discard_deployment_changes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_discard_deployment_changes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3617,6 +4493,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3762,6 +4642,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3907,6 +4791,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4056,6 +4944,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4207,6 +5099,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4361,6 +5257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_public_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_public_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4506,6 +5406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_blueprint_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_blueprint_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4648,6 +5552,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_blueprints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_blueprints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4798,6 +5706,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_deployment_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_deployment_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4944,6 +5856,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5089,6 +6005,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_edge_slms(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_edge_slms_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5236,6 +6156,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_hydrated_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_hydrated_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5389,6 +6313,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_orchestration_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_orchestration_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5536,6 +6464,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_public_blueprints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_public_blueprints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5698,6 +6630,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_propose_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_propose_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5858,6 +6794,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_reject_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_reject_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6126,6 +7066,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_rollback_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6272,6 +7216,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_blueprint_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_blueprint_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6422,6 +7370,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_deployment_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_deployment_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6586,6 +7538,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6739,6 +7695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6895,6 +7855,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/gapic_version.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/gapic_version.py index c1557c8c086b..558c8aab67c5 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/gapic_version.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.2.8" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/client.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/client.py index 078c51795c0e..a5debddbd48e 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/client.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/client.py @@ -14,6 +14,8 @@ # limitations under the License. # from collections import OrderedDict +from http import HTTPStatus +import json import logging as std_logging import os import re @@ -615,6 +617,33 @@ def _validate_universe_domain(self): # NOTE (b/349488459): universe validation is disabled until further notice. return True + def _add_cred_info_for_auth_errors( + self, error: core_exceptions.GoogleAPICallError + ) -> None: + """Adds credential info string to error details for 401/403/404 errors. + + Args: + error (google.api_core.exceptions.GoogleAPICallError): The error to add the cred info. + """ + if error.code not in [ + HTTPStatus.UNAUTHORIZED, + HTTPStatus.FORBIDDEN, + HTTPStatus.NOT_FOUND, + ]: + return + + cred = self._transport._credentials + + # get_cred_info is only available in google-auth>=2.35.0 + if not hasattr(cred, "get_cred_info"): + return + + # ignore the type check since pypy test fails when get_cred_info + # is not available + cred_info = cred.get_cred_info() # type: ignore + if cred_info and hasattr(error._details, "append"): + error._details.append(json.dumps(cred_info)) + @property def api_endpoint(self): """Return the API endpoint used by the client instance. @@ -5161,16 +5190,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -5216,16 +5249,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -5382,16 +5419,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -5437,16 +5478,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/transports/rest.py b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/transports/rest.py index f2d984ffd703..8cc7c517d3ed 100644 --- a/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/transports/rest.py +++ b/packages/google-cloud-telcoautomation/google/cloud/telcoautomation_v1alpha1/services/telco_automation/transports/rest.py @@ -376,12 +376,35 @@ def post_apply_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for apply_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_apply_deployment` interceptor runs + before the `post_apply_deployment_with_metadata` interceptor. """ return response + def post_apply_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for apply_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_apply_deployment_with_metadata` + interceptor in new development instead of the `post_apply_deployment` interceptor. + When both interceptors are used, this `post_apply_deployment_with_metadata` interceptor runs after the + `post_apply_deployment` interceptor. The (possibly modified) response returned by + `post_apply_deployment` will be passed to + `post_apply_deployment_with_metadata`. + """ + return response, metadata + def pre_apply_hydrated_deployment( self, request: telcoautomation.ApplyHydratedDeploymentRequest, @@ -402,12 +425,37 @@ def post_apply_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for apply_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_apply_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_apply_hydrated_deployment` interceptor runs + before the `post_apply_hydrated_deployment_with_metadata` interceptor. """ return response + def post_apply_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for apply_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_apply_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_apply_hydrated_deployment` interceptor. + When both interceptors are used, this `post_apply_hydrated_deployment_with_metadata` interceptor runs after the + `post_apply_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_apply_hydrated_deployment` will be passed to + `post_apply_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_approve_blueprint( self, request: telcoautomation.ApproveBlueprintRequest, @@ -427,12 +475,35 @@ def post_approve_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for approve_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_approve_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_approve_blueprint` interceptor runs + before the `post_approve_blueprint_with_metadata` interceptor. """ return response + def post_approve_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for approve_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_approve_blueprint_with_metadata` + interceptor in new development instead of the `post_approve_blueprint` interceptor. + When both interceptors are used, this `post_approve_blueprint_with_metadata` interceptor runs after the + `post_approve_blueprint` interceptor. The (possibly modified) response returned by + `post_approve_blueprint` will be passed to + `post_approve_blueprint_with_metadata`. + """ + return response, metadata + def pre_compute_deployment_status( self, request: telcoautomation.ComputeDeploymentStatusRequest, @@ -453,12 +524,38 @@ def post_compute_deployment_status( ) -> telcoautomation.ComputeDeploymentStatusResponse: """Post-rpc interceptor for compute_deployment_status - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_compute_deployment_status_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_compute_deployment_status` interceptor runs + before the `post_compute_deployment_status_with_metadata` interceptor. """ return response + def post_compute_deployment_status_with_metadata( + self, + response: telcoautomation.ComputeDeploymentStatusResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ComputeDeploymentStatusResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for compute_deployment_status + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_compute_deployment_status_with_metadata` + interceptor in new development instead of the `post_compute_deployment_status` interceptor. + When both interceptors are used, this `post_compute_deployment_status_with_metadata` interceptor runs after the + `post_compute_deployment_status` interceptor. The (possibly modified) response returned by + `post_compute_deployment_status` will be passed to + `post_compute_deployment_status_with_metadata`. + """ + return response, metadata + def pre_create_blueprint( self, request: telcoautomation.CreateBlueprintRequest, @@ -478,12 +575,35 @@ def post_create_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for create_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_blueprint` interceptor runs + before the `post_create_blueprint_with_metadata` interceptor. """ return response + def post_create_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_blueprint_with_metadata` + interceptor in new development instead of the `post_create_blueprint` interceptor. + When both interceptors are used, this `post_create_blueprint_with_metadata` interceptor runs after the + `post_create_blueprint` interceptor. The (possibly modified) response returned by + `post_create_blueprint` will be passed to + `post_create_blueprint_with_metadata`. + """ + return response, metadata + def pre_create_deployment( self, request: telcoautomation.CreateDeploymentRequest, @@ -503,12 +623,35 @@ def post_create_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for create_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_deployment` interceptor runs + before the `post_create_deployment_with_metadata` interceptor. """ return response + def post_create_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_deployment_with_metadata` + interceptor in new development instead of the `post_create_deployment` interceptor. + When both interceptors are used, this `post_create_deployment_with_metadata` interceptor runs after the + `post_create_deployment` interceptor. The (possibly modified) response returned by + `post_create_deployment` will be passed to + `post_create_deployment_with_metadata`. + """ + return response, metadata + def pre_create_edge_slm( self, request: telcoautomation.CreateEdgeSlmRequest, @@ -528,12 +671,35 @@ def post_create_edge_slm( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_edge_slm` interceptor runs + before the `post_create_edge_slm_with_metadata` interceptor. """ return response + def post_create_edge_slm_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_edge_slm_with_metadata` + interceptor in new development instead of the `post_create_edge_slm` interceptor. + When both interceptors are used, this `post_create_edge_slm_with_metadata` interceptor runs after the + `post_create_edge_slm` interceptor. The (possibly modified) response returned by + `post_create_edge_slm` will be passed to + `post_create_edge_slm_with_metadata`. + """ + return response, metadata + def pre_create_orchestration_cluster( self, request: telcoautomation.CreateOrchestrationClusterRequest, @@ -554,12 +720,35 @@ def post_create_orchestration_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_create_orchestration_cluster` interceptor runs + before the `post_create_orchestration_cluster_with_metadata` interceptor. """ return response + def post_create_orchestration_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_create_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_create_orchestration_cluster` interceptor. + When both interceptors are used, this `post_create_orchestration_cluster_with_metadata` interceptor runs after the + `post_create_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_create_orchestration_cluster` will be passed to + `post_create_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_delete_blueprint( self, request: telcoautomation.DeleteBlueprintRequest, @@ -593,12 +782,35 @@ def post_delete_edge_slm( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_delete_edge_slm` interceptor runs + before the `post_delete_edge_slm_with_metadata` interceptor. """ return response + def post_delete_edge_slm_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_delete_edge_slm_with_metadata` + interceptor in new development instead of the `post_delete_edge_slm` interceptor. + When both interceptors are used, this `post_delete_edge_slm_with_metadata` interceptor runs after the + `post_delete_edge_slm` interceptor. The (possibly modified) response returned by + `post_delete_edge_slm` will be passed to + `post_delete_edge_slm_with_metadata`. + """ + return response, metadata + def pre_delete_orchestration_cluster( self, request: telcoautomation.DeleteOrchestrationClusterRequest, @@ -619,12 +831,35 @@ def post_delete_orchestration_cluster( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_delete_orchestration_cluster` interceptor runs + before the `post_delete_orchestration_cluster_with_metadata` interceptor. """ return response + def post_delete_orchestration_cluster_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_delete_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_delete_orchestration_cluster` interceptor. + When both interceptors are used, this `post_delete_orchestration_cluster_with_metadata` interceptor runs after the + `post_delete_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_delete_orchestration_cluster` will be passed to + `post_delete_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_discard_blueprint_changes( self, request: telcoautomation.DiscardBlueprintChangesRequest, @@ -645,12 +880,38 @@ def post_discard_blueprint_changes( ) -> telcoautomation.DiscardBlueprintChangesResponse: """Post-rpc interceptor for discard_blueprint_changes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_discard_blueprint_changes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_discard_blueprint_changes` interceptor runs + before the `post_discard_blueprint_changes_with_metadata` interceptor. """ return response + def post_discard_blueprint_changes_with_metadata( + self, + response: telcoautomation.DiscardBlueprintChangesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.DiscardBlueprintChangesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for discard_blueprint_changes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_discard_blueprint_changes_with_metadata` + interceptor in new development instead of the `post_discard_blueprint_changes` interceptor. + When both interceptors are used, this `post_discard_blueprint_changes_with_metadata` interceptor runs after the + `post_discard_blueprint_changes` interceptor. The (possibly modified) response returned by + `post_discard_blueprint_changes` will be passed to + `post_discard_blueprint_changes_with_metadata`. + """ + return response, metadata + def pre_discard_deployment_changes( self, request: telcoautomation.DiscardDeploymentChangesRequest, @@ -671,12 +932,38 @@ def post_discard_deployment_changes( ) -> telcoautomation.DiscardDeploymentChangesResponse: """Post-rpc interceptor for discard_deployment_changes - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_discard_deployment_changes_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_discard_deployment_changes` interceptor runs + before the `post_discard_deployment_changes_with_metadata` interceptor. """ return response + def post_discard_deployment_changes_with_metadata( + self, + response: telcoautomation.DiscardDeploymentChangesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.DiscardDeploymentChangesResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for discard_deployment_changes + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_discard_deployment_changes_with_metadata` + interceptor in new development instead of the `post_discard_deployment_changes` interceptor. + When both interceptors are used, this `post_discard_deployment_changes_with_metadata` interceptor runs after the + `post_discard_deployment_changes` interceptor. The (possibly modified) response returned by + `post_discard_deployment_changes` will be passed to + `post_discard_deployment_changes_with_metadata`. + """ + return response, metadata + def pre_get_blueprint( self, request: telcoautomation.GetBlueprintRequest, @@ -696,12 +983,35 @@ def post_get_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for get_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_blueprint` interceptor runs + before the `post_get_blueprint_with_metadata` interceptor. """ return response + def post_get_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_blueprint_with_metadata` + interceptor in new development instead of the `post_get_blueprint` interceptor. + When both interceptors are used, this `post_get_blueprint_with_metadata` interceptor runs after the + `post_get_blueprint` interceptor. The (possibly modified) response returned by + `post_get_blueprint` will be passed to + `post_get_blueprint_with_metadata`. + """ + return response, metadata + def pre_get_deployment( self, request: telcoautomation.GetDeploymentRequest, @@ -721,12 +1031,35 @@ def post_get_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for get_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_deployment` interceptor runs + before the `post_get_deployment_with_metadata` interceptor. """ return response + def post_get_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_deployment_with_metadata` + interceptor in new development instead of the `post_get_deployment` interceptor. + When both interceptors are used, this `post_get_deployment_with_metadata` interceptor runs after the + `post_get_deployment` interceptor. The (possibly modified) response returned by + `post_get_deployment` will be passed to + `post_get_deployment_with_metadata`. + """ + return response, metadata + def pre_get_edge_slm( self, request: telcoautomation.GetEdgeSlmRequest, @@ -746,12 +1079,35 @@ def post_get_edge_slm( ) -> telcoautomation.EdgeSlm: """Post-rpc interceptor for get_edge_slm - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_edge_slm_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_edge_slm` interceptor runs + before the `post_get_edge_slm_with_metadata` interceptor. """ return response + def post_get_edge_slm_with_metadata( + self, + response: telcoautomation.EdgeSlm, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.EdgeSlm, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_edge_slm + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_edge_slm_with_metadata` + interceptor in new development instead of the `post_get_edge_slm` interceptor. + When both interceptors are used, this `post_get_edge_slm_with_metadata` interceptor runs after the + `post_get_edge_slm` interceptor. The (possibly modified) response returned by + `post_get_edge_slm` will be passed to + `post_get_edge_slm_with_metadata`. + """ + return response, metadata + def pre_get_hydrated_deployment( self, request: telcoautomation.GetHydratedDeploymentRequest, @@ -772,12 +1128,37 @@ def post_get_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for get_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_hydrated_deployment` interceptor runs + before the `post_get_hydrated_deployment_with_metadata` interceptor. """ return response + def post_get_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_get_hydrated_deployment` interceptor. + When both interceptors are used, this `post_get_hydrated_deployment_with_metadata` interceptor runs after the + `post_get_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_get_hydrated_deployment` will be passed to + `post_get_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_get_orchestration_cluster( self, request: telcoautomation.GetOrchestrationClusterRequest, @@ -798,12 +1179,37 @@ def post_get_orchestration_cluster( ) -> telcoautomation.OrchestrationCluster: """Post-rpc interceptor for get_orchestration_cluster - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_orchestration_cluster_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_orchestration_cluster` interceptor runs + before the `post_get_orchestration_cluster_with_metadata` interceptor. """ return response + def post_get_orchestration_cluster_with_metadata( + self, + response: telcoautomation.OrchestrationCluster, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.OrchestrationCluster, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_orchestration_cluster + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_orchestration_cluster_with_metadata` + interceptor in new development instead of the `post_get_orchestration_cluster` interceptor. + When both interceptors are used, this `post_get_orchestration_cluster_with_metadata` interceptor runs after the + `post_get_orchestration_cluster` interceptor. The (possibly modified) response returned by + `post_get_orchestration_cluster` will be passed to + `post_get_orchestration_cluster_with_metadata`. + """ + return response, metadata + def pre_get_public_blueprint( self, request: telcoautomation.GetPublicBlueprintRequest, @@ -824,12 +1230,37 @@ def post_get_public_blueprint( ) -> telcoautomation.PublicBlueprint: """Post-rpc interceptor for get_public_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_public_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_get_public_blueprint` interceptor runs + before the `post_get_public_blueprint_with_metadata` interceptor. """ return response + def post_get_public_blueprint_with_metadata( + self, + response: telcoautomation.PublicBlueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.PublicBlueprint, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for get_public_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_get_public_blueprint_with_metadata` + interceptor in new development instead of the `post_get_public_blueprint` interceptor. + When both interceptors are used, this `post_get_public_blueprint_with_metadata` interceptor runs after the + `post_get_public_blueprint` interceptor. The (possibly modified) response returned by + `post_get_public_blueprint` will be passed to + `post_get_public_blueprint_with_metadata`. + """ + return response, metadata + def pre_list_blueprint_revisions( self, request: telcoautomation.ListBlueprintRevisionsRequest, @@ -850,12 +1281,38 @@ def post_list_blueprint_revisions( ) -> telcoautomation.ListBlueprintRevisionsResponse: """Post-rpc interceptor for list_blueprint_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_blueprint_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_blueprint_revisions` interceptor runs + before the `post_list_blueprint_revisions_with_metadata` interceptor. """ return response + def post_list_blueprint_revisions_with_metadata( + self, + response: telcoautomation.ListBlueprintRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListBlueprintRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_blueprint_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_blueprint_revisions_with_metadata` + interceptor in new development instead of the `post_list_blueprint_revisions` interceptor. + When both interceptors are used, this `post_list_blueprint_revisions_with_metadata` interceptor runs after the + `post_list_blueprint_revisions` interceptor. The (possibly modified) response returned by + `post_list_blueprint_revisions` will be passed to + `post_list_blueprint_revisions_with_metadata`. + """ + return response, metadata + def pre_list_blueprints( self, request: telcoautomation.ListBlueprintsRequest, @@ -875,12 +1332,37 @@ def post_list_blueprints( ) -> telcoautomation.ListBlueprintsResponse: """Post-rpc interceptor for list_blueprints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_blueprints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_blueprints` interceptor runs + before the `post_list_blueprints_with_metadata` interceptor. """ return response + def post_list_blueprints_with_metadata( + self, + response: telcoautomation.ListBlueprintsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListBlueprintsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_blueprints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_blueprints_with_metadata` + interceptor in new development instead of the `post_list_blueprints` interceptor. + When both interceptors are used, this `post_list_blueprints_with_metadata` interceptor runs after the + `post_list_blueprints` interceptor. The (possibly modified) response returned by + `post_list_blueprints` will be passed to + `post_list_blueprints_with_metadata`. + """ + return response, metadata + def pre_list_deployment_revisions( self, request: telcoautomation.ListDeploymentRevisionsRequest, @@ -901,12 +1383,38 @@ def post_list_deployment_revisions( ) -> telcoautomation.ListDeploymentRevisionsResponse: """Post-rpc interceptor for list_deployment_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_deployment_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_deployment_revisions` interceptor runs + before the `post_list_deployment_revisions_with_metadata` interceptor. """ return response + def post_list_deployment_revisions_with_metadata( + self, + response: telcoautomation.ListDeploymentRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListDeploymentRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_deployment_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_deployment_revisions_with_metadata` + interceptor in new development instead of the `post_list_deployment_revisions` interceptor. + When both interceptors are used, this `post_list_deployment_revisions_with_metadata` interceptor runs after the + `post_list_deployment_revisions` interceptor. The (possibly modified) response returned by + `post_list_deployment_revisions` will be passed to + `post_list_deployment_revisions_with_metadata`. + """ + return response, metadata + def pre_list_deployments( self, request: telcoautomation.ListDeploymentsRequest, @@ -926,12 +1434,37 @@ def post_list_deployments( ) -> telcoautomation.ListDeploymentsResponse: """Post-rpc interceptor for list_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_deployments` interceptor runs + before the `post_list_deployments_with_metadata` interceptor. """ return response + def post_list_deployments_with_metadata( + self, + response: telcoautomation.ListDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListDeploymentsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_deployments_with_metadata` + interceptor in new development instead of the `post_list_deployments` interceptor. + When both interceptors are used, this `post_list_deployments_with_metadata` interceptor runs after the + `post_list_deployments` interceptor. The (possibly modified) response returned by + `post_list_deployments` will be passed to + `post_list_deployments_with_metadata`. + """ + return response, metadata + def pre_list_edge_slms( self, request: telcoautomation.ListEdgeSlmsRequest, @@ -951,12 +1484,37 @@ def post_list_edge_slms( ) -> telcoautomation.ListEdgeSlmsResponse: """Post-rpc interceptor for list_edge_slms - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_edge_slms_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_edge_slms` interceptor runs + before the `post_list_edge_slms_with_metadata` interceptor. """ return response + def post_list_edge_slms_with_metadata( + self, + response: telcoautomation.ListEdgeSlmsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListEdgeSlmsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_edge_slms + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_edge_slms_with_metadata` + interceptor in new development instead of the `post_list_edge_slms` interceptor. + When both interceptors are used, this `post_list_edge_slms_with_metadata` interceptor runs after the + `post_list_edge_slms` interceptor. The (possibly modified) response returned by + `post_list_edge_slms` will be passed to + `post_list_edge_slms_with_metadata`. + """ + return response, metadata + def pre_list_hydrated_deployments( self, request: telcoautomation.ListHydratedDeploymentsRequest, @@ -977,12 +1535,38 @@ def post_list_hydrated_deployments( ) -> telcoautomation.ListHydratedDeploymentsResponse: """Post-rpc interceptor for list_hydrated_deployments - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_hydrated_deployments_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_hydrated_deployments` interceptor runs + before the `post_list_hydrated_deployments_with_metadata` interceptor. """ return response + def post_list_hydrated_deployments_with_metadata( + self, + response: telcoautomation.ListHydratedDeploymentsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListHydratedDeploymentsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_hydrated_deployments + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_hydrated_deployments_with_metadata` + interceptor in new development instead of the `post_list_hydrated_deployments` interceptor. + When both interceptors are used, this `post_list_hydrated_deployments_with_metadata` interceptor runs after the + `post_list_hydrated_deployments` interceptor. The (possibly modified) response returned by + `post_list_hydrated_deployments` will be passed to + `post_list_hydrated_deployments_with_metadata`. + """ + return response, metadata + def pre_list_orchestration_clusters( self, request: telcoautomation.ListOrchestrationClustersRequest, @@ -1003,12 +1587,38 @@ def post_list_orchestration_clusters( ) -> telcoautomation.ListOrchestrationClustersResponse: """Post-rpc interceptor for list_orchestration_clusters - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_orchestration_clusters_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_orchestration_clusters` interceptor runs + before the `post_list_orchestration_clusters_with_metadata` interceptor. """ return response + def post_list_orchestration_clusters_with_metadata( + self, + response: telcoautomation.ListOrchestrationClustersResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListOrchestrationClustersResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_orchestration_clusters + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_orchestration_clusters_with_metadata` + interceptor in new development instead of the `post_list_orchestration_clusters` interceptor. + When both interceptors are used, this `post_list_orchestration_clusters_with_metadata` interceptor runs after the + `post_list_orchestration_clusters` interceptor. The (possibly modified) response returned by + `post_list_orchestration_clusters` will be passed to + `post_list_orchestration_clusters_with_metadata`. + """ + return response, metadata + def pre_list_public_blueprints( self, request: telcoautomation.ListPublicBlueprintsRequest, @@ -1029,12 +1639,38 @@ def post_list_public_blueprints( ) -> telcoautomation.ListPublicBlueprintsResponse: """Post-rpc interceptor for list_public_blueprints - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_public_blueprints_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_list_public_blueprints` interceptor runs + before the `post_list_public_blueprints_with_metadata` interceptor. """ return response + def post_list_public_blueprints_with_metadata( + self, + response: telcoautomation.ListPublicBlueprintsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.ListPublicBlueprintsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for list_public_blueprints + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_list_public_blueprints_with_metadata` + interceptor in new development instead of the `post_list_public_blueprints` interceptor. + When both interceptors are used, this `post_list_public_blueprints_with_metadata` interceptor runs after the + `post_list_public_blueprints` interceptor. The (possibly modified) response returned by + `post_list_public_blueprints` will be passed to + `post_list_public_blueprints_with_metadata`. + """ + return response, metadata + def pre_propose_blueprint( self, request: telcoautomation.ProposeBlueprintRequest, @@ -1054,12 +1690,35 @@ def post_propose_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for propose_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_propose_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_propose_blueprint` interceptor runs + before the `post_propose_blueprint_with_metadata` interceptor. """ return response + def post_propose_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for propose_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_propose_blueprint_with_metadata` + interceptor in new development instead of the `post_propose_blueprint` interceptor. + When both interceptors are used, this `post_propose_blueprint_with_metadata` interceptor runs after the + `post_propose_blueprint` interceptor. The (possibly modified) response returned by + `post_propose_blueprint` will be passed to + `post_propose_blueprint_with_metadata`. + """ + return response, metadata + def pre_reject_blueprint( self, request: telcoautomation.RejectBlueprintRequest, @@ -1079,12 +1738,35 @@ def post_reject_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for reject_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reject_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_reject_blueprint` interceptor runs + before the `post_reject_blueprint_with_metadata` interceptor. """ return response + def post_reject_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for reject_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_reject_blueprint_with_metadata` + interceptor in new development instead of the `post_reject_blueprint` interceptor. + When both interceptors are used, this `post_reject_blueprint_with_metadata` interceptor runs after the + `post_reject_blueprint` interceptor. The (possibly modified) response returned by + `post_reject_blueprint` will be passed to + `post_reject_blueprint_with_metadata`. + """ + return response, metadata + def pre_remove_deployment( self, request: telcoautomation.RemoveDeploymentRequest, @@ -1119,12 +1801,35 @@ def post_rollback_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for rollback_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_rollback_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_rollback_deployment` interceptor runs + before the `post_rollback_deployment_with_metadata` interceptor. """ return response + def post_rollback_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for rollback_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_rollback_deployment_with_metadata` + interceptor in new development instead of the `post_rollback_deployment` interceptor. + When both interceptors are used, this `post_rollback_deployment_with_metadata` interceptor runs after the + `post_rollback_deployment` interceptor. The (possibly modified) response returned by + `post_rollback_deployment` will be passed to + `post_rollback_deployment_with_metadata`. + """ + return response, metadata + def pre_search_blueprint_revisions( self, request: telcoautomation.SearchBlueprintRevisionsRequest, @@ -1145,12 +1850,38 @@ def post_search_blueprint_revisions( ) -> telcoautomation.SearchBlueprintRevisionsResponse: """Post-rpc interceptor for search_blueprint_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_blueprint_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_search_blueprint_revisions` interceptor runs + before the `post_search_blueprint_revisions_with_metadata` interceptor. """ return response + def post_search_blueprint_revisions_with_metadata( + self, + response: telcoautomation.SearchBlueprintRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.SearchBlueprintRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_blueprint_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_search_blueprint_revisions_with_metadata` + interceptor in new development instead of the `post_search_blueprint_revisions` interceptor. + When both interceptors are used, this `post_search_blueprint_revisions_with_metadata` interceptor runs after the + `post_search_blueprint_revisions` interceptor. The (possibly modified) response returned by + `post_search_blueprint_revisions` will be passed to + `post_search_blueprint_revisions_with_metadata`. + """ + return response, metadata + def pre_search_deployment_revisions( self, request: telcoautomation.SearchDeploymentRevisionsRequest, @@ -1171,12 +1902,38 @@ def post_search_deployment_revisions( ) -> telcoautomation.SearchDeploymentRevisionsResponse: """Post-rpc interceptor for search_deployment_revisions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_search_deployment_revisions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_search_deployment_revisions` interceptor runs + before the `post_search_deployment_revisions_with_metadata` interceptor. """ return response + def post_search_deployment_revisions_with_metadata( + self, + response: telcoautomation.SearchDeploymentRevisionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.SearchDeploymentRevisionsResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for search_deployment_revisions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_search_deployment_revisions_with_metadata` + interceptor in new development instead of the `post_search_deployment_revisions` interceptor. + When both interceptors are used, this `post_search_deployment_revisions_with_metadata` interceptor runs after the + `post_search_deployment_revisions` interceptor. The (possibly modified) response returned by + `post_search_deployment_revisions` will be passed to + `post_search_deployment_revisions_with_metadata`. + """ + return response, metadata + def pre_update_blueprint( self, request: telcoautomation.UpdateBlueprintRequest, @@ -1196,12 +1953,35 @@ def post_update_blueprint( ) -> telcoautomation.Blueprint: """Post-rpc interceptor for update_blueprint - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_blueprint_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_blueprint` interceptor runs + before the `post_update_blueprint_with_metadata` interceptor. """ return response + def post_update_blueprint_with_metadata( + self, + response: telcoautomation.Blueprint, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Blueprint, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_blueprint + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_blueprint_with_metadata` + interceptor in new development instead of the `post_update_blueprint` interceptor. + When both interceptors are used, this `post_update_blueprint_with_metadata` interceptor runs after the + `post_update_blueprint` interceptor. The (possibly modified) response returned by + `post_update_blueprint` will be passed to + `post_update_blueprint_with_metadata`. + """ + return response, metadata + def pre_update_deployment( self, request: telcoautomation.UpdateDeploymentRequest, @@ -1221,12 +2001,35 @@ def post_update_deployment( ) -> telcoautomation.Deployment: """Post-rpc interceptor for update_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_deployment` interceptor runs + before the `post_update_deployment_with_metadata` interceptor. """ return response + def post_update_deployment_with_metadata( + self, + response: telcoautomation.Deployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[telcoautomation.Deployment, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_deployment_with_metadata` + interceptor in new development instead of the `post_update_deployment` interceptor. + When both interceptors are used, this `post_update_deployment_with_metadata` interceptor runs after the + `post_update_deployment` interceptor. The (possibly modified) response returned by + `post_update_deployment` will be passed to + `post_update_deployment_with_metadata`. + """ + return response, metadata + def pre_update_hydrated_deployment( self, request: telcoautomation.UpdateHydratedDeploymentRequest, @@ -1247,12 +2050,37 @@ def post_update_hydrated_deployment( ) -> telcoautomation.HydratedDeployment: """Post-rpc interceptor for update_hydrated_deployment - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_hydrated_deployment_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TelcoAutomation server but before - it is returned to user code. + it is returned to user code. This `post_update_hydrated_deployment` interceptor runs + before the `post_update_hydrated_deployment_with_metadata` interceptor. """ return response + def post_update_hydrated_deployment_with_metadata( + self, + response: telcoautomation.HydratedDeployment, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + telcoautomation.HydratedDeployment, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for update_hydrated_deployment + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TelcoAutomation server but before it is returned to user code. + + We recommend only using this `post_update_hydrated_deployment_with_metadata` + interceptor in new development instead of the `post_update_hydrated_deployment` interceptor. + When both interceptors are used, this `post_update_hydrated_deployment_with_metadata` interceptor runs after the + `post_update_hydrated_deployment` interceptor. The (possibly modified) response returned by + `post_update_hydrated_deployment` will be passed to + `post_update_hydrated_deployment_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1676,6 +2504,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1832,6 +2664,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_apply_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_apply_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1994,6 +2830,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_approve_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_approve_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2139,6 +2979,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_compute_deployment_status(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_compute_deployment_status_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2303,6 +3147,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2456,6 +3304,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2603,6 +3455,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2757,6 +3613,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3006,6 +3866,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3154,6 +4018,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3305,6 +4173,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_discard_blueprint_changes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_discard_blueprint_changes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3461,6 +4333,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_discard_deployment_changes(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_discard_deployment_changes_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3617,6 +4493,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3762,6 +4642,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3907,6 +4791,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_edge_slm(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_edge_slm_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4056,6 +4944,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4207,6 +5099,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_orchestration_cluster(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_orchestration_cluster_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4361,6 +5257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_public_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_public_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4506,6 +5406,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_blueprint_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_blueprint_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4648,6 +5552,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_blueprints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_blueprints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4798,6 +5706,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_deployment_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_deployment_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -4944,6 +5856,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5089,6 +6005,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_edge_slms(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_edge_slms_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5236,6 +6156,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_hydrated_deployments(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_hydrated_deployments_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5389,6 +6313,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_orchestration_clusters(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_orchestration_clusters_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5536,6 +6464,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_public_blueprints(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_public_blueprints_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5698,6 +6630,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_propose_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_propose_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -5858,6 +6794,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_reject_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_reject_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6126,6 +7066,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_rollback_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_rollback_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6272,6 +7216,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_blueprint_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_blueprint_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6422,6 +7370,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_search_deployment_revisions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_search_deployment_revisions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6586,6 +7538,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_blueprint(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_blueprint_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6739,6 +7695,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -6895,6 +7855,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_hydrated_deployment(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_hydrated_deployment_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1.json b/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1.json index 374a1976ab40..93aa6c2fef47 100644 --- a/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1.json +++ b/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-telcoautomation", - "version": "0.2.8" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1alpha1.json b/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1alpha1.json index e125bd7dca50..49a97e5ab862 100644 --- a/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1alpha1.json +++ b/packages/google-cloud-telcoautomation/samples/generated_samples/snippet_metadata_google.cloud.telcoautomation.v1alpha1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-telcoautomation", - "version": "0.2.8" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1/test_telco_automation.py b/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1/test_telco_automation.py index c108e83fe541..016ef2354e62 100644 --- a/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1/test_telco_automation.py +++ b/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1/test_telco_automation.py @@ -74,6 +74,13 @@ ) from google.cloud.telcoautomation_v1.types import telcoautomation +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 = TelcoAutomationClient(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 = TelcoAutomationClient(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", [ @@ -25556,10 +25606,14 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_orchestration_clusters" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_orchestration_clusters_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_orchestration_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListOrchestrationClustersRequest.pb( telcoautomation.ListOrchestrationClustersRequest() ) @@ -25585,6 +25639,10 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListOrchestrationClustersResponse() + post_with_metadata.return_value = ( + telcoautomation.ListOrchestrationClustersResponse(), + metadata, + ) client.list_orchestration_clusters( request, @@ -25596,6 +25654,7 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_orchestration_cluster_rest_bad_request( @@ -25688,10 +25747,14 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetOrchestrationClusterRequest.pb( telcoautomation.GetOrchestrationClusterRequest() ) @@ -25717,6 +25780,10 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.OrchestrationCluster() + post_with_metadata.return_value = ( + telcoautomation.OrchestrationCluster(), + metadata, + ) client.get_orchestration_cluster( request, @@ -25728,6 +25795,7 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_orchestration_cluster_rest_bad_request( @@ -25916,10 +25984,14 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_create_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateOrchestrationClusterRequest.pb( telcoautomation.CreateOrchestrationClusterRequest() ) @@ -25943,6 +26015,7 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_orchestration_cluster( request, @@ -25954,6 +26027,7 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_orchestration_cluster_rest_bad_request( @@ -26038,10 +26112,14 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_delete_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_delete_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_delete_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DeleteOrchestrationClusterRequest.pb( telcoautomation.DeleteOrchestrationClusterRequest() ) @@ -26065,6 +26143,7 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_orchestration_cluster( request, @@ -26076,6 +26155,7 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_edge_slms_rest_bad_request( @@ -26162,10 +26242,13 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_edge_slms" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_edge_slms_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_edge_slms" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListEdgeSlmsRequest.pb( telcoautomation.ListEdgeSlmsRequest() ) @@ -26191,6 +26274,10 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListEdgeSlmsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListEdgeSlmsResponse(), + metadata, + ) client.list_edge_slms( request, @@ -26202,6 +26289,7 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_edge_slm_rest_bad_request(request_type=telcoautomation.GetEdgeSlmRequest): @@ -26295,10 +26383,13 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetEdgeSlmRequest.pb( telcoautomation.GetEdgeSlmRequest() ) @@ -26322,6 +26413,7 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.EdgeSlm() + post_with_metadata.return_value = telcoautomation.EdgeSlm(), metadata client.get_edge_slm( request, @@ -26333,6 +26425,7 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_edge_slm_rest_bad_request( @@ -26490,10 +26583,13 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_create_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateEdgeSlmRequest.pb( telcoautomation.CreateEdgeSlmRequest() ) @@ -26517,6 +26613,7 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_edge_slm( request, @@ -26528,6 +26625,7 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_edge_slm_rest_bad_request( @@ -26608,10 +26706,13 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_delete_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_delete_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_delete_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DeleteEdgeSlmRequest.pb( telcoautomation.DeleteEdgeSlmRequest() ) @@ -26635,6 +26736,7 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_edge_slm( request, @@ -26646,6 +26748,7 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_blueprint_rest_bad_request( @@ -26840,10 +26943,13 @@ def test_create_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_create_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateBlueprintRequest.pb( telcoautomation.CreateBlueprintRequest() ) @@ -26867,6 +26973,7 @@ def test_create_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.create_blueprint( request, @@ -26878,6 +26985,7 @@ def test_create_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_blueprint_rest_bad_request( @@ -27076,10 +27184,13 @@ def test_update_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_update_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateBlueprintRequest.pb( telcoautomation.UpdateBlueprintRequest() ) @@ -27103,6 +27214,7 @@ def test_update_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.update_blueprint( request, @@ -27114,6 +27226,7 @@ def test_update_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_blueprint_rest_bad_request( @@ -27218,10 +27331,13 @@ def test_get_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetBlueprintRequest.pb( telcoautomation.GetBlueprintRequest() ) @@ -27245,6 +27361,7 @@ def test_get_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.get_blueprint( request, @@ -27256,6 +27373,7 @@ def test_get_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_blueprint_rest_bad_request( @@ -27457,10 +27575,13 @@ def test_list_blueprints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_blueprints" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_blueprints_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_blueprints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListBlueprintsRequest.pb( telcoautomation.ListBlueprintsRequest() ) @@ -27486,6 +27607,10 @@ def test_list_blueprints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListBlueprintsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListBlueprintsResponse(), + metadata, + ) client.list_blueprints( request, @@ -27497,6 +27622,7 @@ def test_list_blueprints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_approve_blueprint_rest_bad_request( @@ -27601,10 +27727,14 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_approve_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_approve_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_approve_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApproveBlueprintRequest.pb( telcoautomation.ApproveBlueprintRequest() ) @@ -27628,6 +27758,7 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.approve_blueprint( request, @@ -27639,6 +27770,7 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_propose_blueprint_rest_bad_request( @@ -27743,10 +27875,14 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_propose_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_propose_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_propose_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ProposeBlueprintRequest.pb( telcoautomation.ProposeBlueprintRequest() ) @@ -27770,6 +27906,7 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.propose_blueprint( request, @@ -27781,6 +27918,7 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reject_blueprint_rest_bad_request( @@ -27885,10 +28023,13 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_reject_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_reject_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_reject_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.RejectBlueprintRequest.pb( telcoautomation.RejectBlueprintRequest() ) @@ -27912,6 +28053,7 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.reject_blueprint( request, @@ -27923,6 +28065,7 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_blueprint_revisions_rest_bad_request( @@ -28011,10 +28154,14 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_blueprint_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_blueprint_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_blueprint_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListBlueprintRevisionsRequest.pb( telcoautomation.ListBlueprintRevisionsRequest() ) @@ -28040,6 +28187,10 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListBlueprintRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListBlueprintRevisionsResponse(), + metadata, + ) client.list_blueprint_revisions( request, @@ -28051,6 +28202,7 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_blueprint_revisions_rest_bad_request( @@ -28139,10 +28291,14 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_search_blueprint_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_search_blueprint_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_search_blueprint_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.SearchBlueprintRevisionsRequest.pb( telcoautomation.SearchBlueprintRevisionsRequest() ) @@ -28168,6 +28324,10 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.SearchBlueprintRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.SearchBlueprintRevisionsResponse(), + metadata, + ) client.search_blueprint_revisions( request, @@ -28179,6 +28339,7 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_deployment_revisions_rest_bad_request( @@ -28269,10 +28430,14 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_search_deployment_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_search_deployment_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_search_deployment_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.SearchDeploymentRevisionsRequest.pb( telcoautomation.SearchDeploymentRevisionsRequest() ) @@ -28298,6 +28463,10 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.SearchDeploymentRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.SearchDeploymentRevisionsResponse(), + metadata, + ) client.search_deployment_revisions( request, @@ -28309,6 +28478,7 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_discard_blueprint_changes_rest_bad_request( @@ -28394,10 +28564,14 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_discard_blueprint_changes" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_discard_blueprint_changes_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_discard_blueprint_changes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DiscardBlueprintChangesRequest.pb( telcoautomation.DiscardBlueprintChangesRequest() ) @@ -28423,6 +28597,10 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.DiscardBlueprintChangesResponse() + post_with_metadata.return_value = ( + telcoautomation.DiscardBlueprintChangesResponse(), + metadata, + ) client.discard_blueprint_changes( request, @@ -28434,6 +28612,7 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_public_blueprints_rest_bad_request( @@ -28518,10 +28697,14 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_public_blueprints" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_public_blueprints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_public_blueprints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListPublicBlueprintsRequest.pb( telcoautomation.ListPublicBlueprintsRequest() ) @@ -28547,6 +28730,10 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListPublicBlueprintsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListPublicBlueprintsResponse(), + metadata, + ) client.list_public_blueprints( request, @@ -28558,6 +28745,7 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_public_blueprint_rest_bad_request( @@ -28656,10 +28844,14 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_public_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_public_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_public_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetPublicBlueprintRequest.pb( telcoautomation.GetPublicBlueprintRequest() ) @@ -28685,6 +28877,7 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.PublicBlueprint() + post_with_metadata.return_value = telcoautomation.PublicBlueprint(), metadata client.get_public_blueprint( request, @@ -28696,6 +28889,7 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_deployment_rest_bad_request( @@ -28893,10 +29087,14 @@ def test_create_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_create_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateDeploymentRequest.pb( telcoautomation.CreateDeploymentRequest() ) @@ -28920,6 +29118,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.create_deployment( request, @@ -28931,6 +29130,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_deployment_rest_bad_request( @@ -29132,10 +29332,14 @@ def test_update_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_update_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateDeploymentRequest.pb( telcoautomation.UpdateDeploymentRequest() ) @@ -29159,6 +29363,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.update_deployment( request, @@ -29170,6 +29375,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_deployment_rest_bad_request( @@ -29276,10 +29482,13 @@ def test_get_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetDeploymentRequest.pb( telcoautomation.GetDeploymentRequest() ) @@ -29303,6 +29512,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.get_deployment( request, @@ -29314,6 +29524,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_deployment_rest_bad_request( @@ -29515,10 +29726,13 @@ def test_list_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_deployments" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListDeploymentsRequest.pb( telcoautomation.ListDeploymentsRequest() ) @@ -29544,6 +29758,10 @@ def test_list_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListDeploymentsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListDeploymentsResponse(), + metadata, + ) client.list_deployments( request, @@ -29555,6 +29773,7 @@ def test_list_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_deployment_revisions_rest_bad_request( @@ -29643,10 +29862,14 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_deployment_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_deployment_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_deployment_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListDeploymentRevisionsRequest.pb( telcoautomation.ListDeploymentRevisionsRequest() ) @@ -29672,6 +29895,10 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListDeploymentRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListDeploymentRevisionsResponse(), + metadata, + ) client.list_deployment_revisions( request, @@ -29683,6 +29910,7 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_discard_deployment_changes_rest_bad_request( @@ -29768,10 +29996,14 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_discard_deployment_changes" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_discard_deployment_changes_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_discard_deployment_changes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DiscardDeploymentChangesRequest.pb( telcoautomation.DiscardDeploymentChangesRequest() ) @@ -29797,6 +30029,10 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.DiscardDeploymentChangesResponse() + post_with_metadata.return_value = ( + telcoautomation.DiscardDeploymentChangesResponse(), + metadata, + ) client.discard_deployment_changes( request, @@ -29808,6 +30044,7 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_deployment_rest_bad_request( @@ -29914,10 +30151,13 @@ def test_apply_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_apply_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_apply_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_apply_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApplyDeploymentRequest.pb( telcoautomation.ApplyDeploymentRequest() ) @@ -29941,6 +30181,7 @@ def test_apply_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.apply_deployment( request, @@ -29952,6 +30193,7 @@ def test_apply_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_compute_deployment_status_rest_bad_request( @@ -30042,10 +30284,14 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_compute_deployment_status" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_compute_deployment_status_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_compute_deployment_status" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ComputeDeploymentStatusRequest.pb( telcoautomation.ComputeDeploymentStatusRequest() ) @@ -30071,6 +30317,10 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ComputeDeploymentStatusResponse() + post_with_metadata.return_value = ( + telcoautomation.ComputeDeploymentStatusResponse(), + metadata, + ) client.compute_deployment_status( request, @@ -30082,6 +30332,7 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_rollback_deployment_rest_bad_request( @@ -30188,10 +30439,14 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_rollback_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_rollback_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_rollback_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.RollbackDeploymentRequest.pb( telcoautomation.RollbackDeploymentRequest() ) @@ -30215,6 +30470,7 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.rollback_deployment( request, @@ -30226,6 +30482,7 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_hydrated_deployment_rest_bad_request( @@ -30318,10 +30575,14 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetHydratedDeploymentRequest.pb( telcoautomation.GetHydratedDeploymentRequest() ) @@ -30347,6 +30608,7 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.get_hydrated_deployment( request, @@ -30358,6 +30620,7 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_hydrated_deployments_rest_bad_request( @@ -30446,10 +30709,14 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_hydrated_deployments" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_hydrated_deployments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_hydrated_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListHydratedDeploymentsRequest.pb( telcoautomation.ListHydratedDeploymentsRequest() ) @@ -30475,6 +30742,10 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListHydratedDeploymentsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListHydratedDeploymentsResponse(), + metadata, + ) client.list_hydrated_deployments( request, @@ -30486,6 +30757,7 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_hydrated_deployment_rest_bad_request( @@ -30664,10 +30936,14 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_update_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateHydratedDeploymentRequest.pb( telcoautomation.UpdateHydratedDeploymentRequest() ) @@ -30693,6 +30969,7 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.update_hydrated_deployment( request, @@ -30704,6 +30981,7 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_hydrated_deployment_rest_bad_request( @@ -30796,10 +31074,14 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_apply_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_apply_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_apply_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApplyHydratedDeploymentRequest.pb( telcoautomation.ApplyHydratedDeploymentRequest() ) @@ -30825,6 +31107,7 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.apply_hydrated_deployment( request, @@ -30836,6 +31119,7 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1alpha1/test_telco_automation.py b/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1alpha1/test_telco_automation.py index 2ed665cb933b..25738327cc46 100644 --- a/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1alpha1/test_telco_automation.py +++ b/packages/google-cloud-telcoautomation/tests/unit/gapic/telcoautomation_v1alpha1/test_telco_automation.py @@ -74,6 +74,13 @@ ) from google.cloud.telcoautomation_v1alpha1.types import telcoautomation +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 = TelcoAutomationClient(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 = TelcoAutomationClient(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", [ @@ -25560,10 +25610,14 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_orchestration_clusters" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_orchestration_clusters_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_orchestration_clusters" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListOrchestrationClustersRequest.pb( telcoautomation.ListOrchestrationClustersRequest() ) @@ -25589,6 +25643,10 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListOrchestrationClustersResponse() + post_with_metadata.return_value = ( + telcoautomation.ListOrchestrationClustersResponse(), + metadata, + ) client.list_orchestration_clusters( request, @@ -25600,6 +25658,7 @@ def test_list_orchestration_clusters_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_orchestration_cluster_rest_bad_request( @@ -25692,10 +25751,14 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetOrchestrationClusterRequest.pb( telcoautomation.GetOrchestrationClusterRequest() ) @@ -25721,6 +25784,10 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.OrchestrationCluster() + post_with_metadata.return_value = ( + telcoautomation.OrchestrationCluster(), + metadata, + ) client.get_orchestration_cluster( request, @@ -25732,6 +25799,7 @@ def test_get_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_orchestration_cluster_rest_bad_request( @@ -25920,10 +25988,14 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_create_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateOrchestrationClusterRequest.pb( telcoautomation.CreateOrchestrationClusterRequest() ) @@ -25947,6 +26019,7 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_orchestration_cluster( request, @@ -25958,6 +26031,7 @@ def test_create_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_orchestration_cluster_rest_bad_request( @@ -26042,10 +26116,14 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_delete_orchestration_cluster" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_delete_orchestration_cluster_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_delete_orchestration_cluster" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DeleteOrchestrationClusterRequest.pb( telcoautomation.DeleteOrchestrationClusterRequest() ) @@ -26069,6 +26147,7 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_orchestration_cluster( request, @@ -26080,6 +26159,7 @@ def test_delete_orchestration_cluster_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_edge_slms_rest_bad_request( @@ -26166,10 +26246,13 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_edge_slms" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_edge_slms_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_edge_slms" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListEdgeSlmsRequest.pb( telcoautomation.ListEdgeSlmsRequest() ) @@ -26195,6 +26278,10 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListEdgeSlmsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListEdgeSlmsResponse(), + metadata, + ) client.list_edge_slms( request, @@ -26206,6 +26293,7 @@ def test_list_edge_slms_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_edge_slm_rest_bad_request(request_type=telcoautomation.GetEdgeSlmRequest): @@ -26299,10 +26387,13 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetEdgeSlmRequest.pb( telcoautomation.GetEdgeSlmRequest() ) @@ -26326,6 +26417,7 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.EdgeSlm() + post_with_metadata.return_value = telcoautomation.EdgeSlm(), metadata client.get_edge_slm( request, @@ -26337,6 +26429,7 @@ def test_get_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_edge_slm_rest_bad_request( @@ -26494,10 +26587,13 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_create_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateEdgeSlmRequest.pb( telcoautomation.CreateEdgeSlmRequest() ) @@ -26521,6 +26617,7 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_edge_slm( request, @@ -26532,6 +26629,7 @@ def test_create_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_edge_slm_rest_bad_request( @@ -26612,10 +26710,13 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_delete_edge_slm" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_delete_edge_slm_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_delete_edge_slm" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DeleteEdgeSlmRequest.pb( telcoautomation.DeleteEdgeSlmRequest() ) @@ -26639,6 +26740,7 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_edge_slm( request, @@ -26650,6 +26752,7 @@ def test_delete_edge_slm_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_blueprint_rest_bad_request( @@ -26844,10 +26947,13 @@ def test_create_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_create_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateBlueprintRequest.pb( telcoautomation.CreateBlueprintRequest() ) @@ -26871,6 +26977,7 @@ def test_create_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.create_blueprint( request, @@ -26882,6 +26989,7 @@ def test_create_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_blueprint_rest_bad_request( @@ -27080,10 +27188,13 @@ def test_update_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_update_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateBlueprintRequest.pb( telcoautomation.UpdateBlueprintRequest() ) @@ -27107,6 +27218,7 @@ def test_update_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.update_blueprint( request, @@ -27118,6 +27230,7 @@ def test_update_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_blueprint_rest_bad_request( @@ -27222,10 +27335,13 @@ def test_get_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetBlueprintRequest.pb( telcoautomation.GetBlueprintRequest() ) @@ -27249,6 +27365,7 @@ def test_get_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.get_blueprint( request, @@ -27260,6 +27377,7 @@ def test_get_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_blueprint_rest_bad_request( @@ -27461,10 +27579,13 @@ def test_list_blueprints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_blueprints" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_blueprints_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_blueprints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListBlueprintsRequest.pb( telcoautomation.ListBlueprintsRequest() ) @@ -27490,6 +27611,10 @@ def test_list_blueprints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListBlueprintsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListBlueprintsResponse(), + metadata, + ) client.list_blueprints( request, @@ -27501,6 +27626,7 @@ def test_list_blueprints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_approve_blueprint_rest_bad_request( @@ -27605,10 +27731,14 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_approve_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_approve_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_approve_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApproveBlueprintRequest.pb( telcoautomation.ApproveBlueprintRequest() ) @@ -27632,6 +27762,7 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.approve_blueprint( request, @@ -27643,6 +27774,7 @@ def test_approve_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_propose_blueprint_rest_bad_request( @@ -27747,10 +27879,14 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_propose_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_propose_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_propose_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ProposeBlueprintRequest.pb( telcoautomation.ProposeBlueprintRequest() ) @@ -27774,6 +27910,7 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.propose_blueprint( request, @@ -27785,6 +27922,7 @@ def test_propose_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reject_blueprint_rest_bad_request( @@ -27889,10 +28027,13 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_reject_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_reject_blueprint_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_reject_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.RejectBlueprintRequest.pb( telcoautomation.RejectBlueprintRequest() ) @@ -27916,6 +28057,7 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Blueprint() + post_with_metadata.return_value = telcoautomation.Blueprint(), metadata client.reject_blueprint( request, @@ -27927,6 +28069,7 @@ def test_reject_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_blueprint_revisions_rest_bad_request( @@ -28015,10 +28158,14 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_blueprint_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_blueprint_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_blueprint_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListBlueprintRevisionsRequest.pb( telcoautomation.ListBlueprintRevisionsRequest() ) @@ -28044,6 +28191,10 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListBlueprintRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListBlueprintRevisionsResponse(), + metadata, + ) client.list_blueprint_revisions( request, @@ -28055,6 +28206,7 @@ def test_list_blueprint_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_blueprint_revisions_rest_bad_request( @@ -28143,10 +28295,14 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_search_blueprint_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_search_blueprint_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_search_blueprint_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.SearchBlueprintRevisionsRequest.pb( telcoautomation.SearchBlueprintRevisionsRequest() ) @@ -28172,6 +28328,10 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.SearchBlueprintRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.SearchBlueprintRevisionsResponse(), + metadata, + ) client.search_blueprint_revisions( request, @@ -28183,6 +28343,7 @@ def test_search_blueprint_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_search_deployment_revisions_rest_bad_request( @@ -28273,10 +28434,14 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_search_deployment_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_search_deployment_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_search_deployment_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.SearchDeploymentRevisionsRequest.pb( telcoautomation.SearchDeploymentRevisionsRequest() ) @@ -28302,6 +28467,10 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.SearchDeploymentRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.SearchDeploymentRevisionsResponse(), + metadata, + ) client.search_deployment_revisions( request, @@ -28313,6 +28482,7 @@ def test_search_deployment_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_discard_blueprint_changes_rest_bad_request( @@ -28398,10 +28568,14 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_discard_blueprint_changes" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_discard_blueprint_changes_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_discard_blueprint_changes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DiscardBlueprintChangesRequest.pb( telcoautomation.DiscardBlueprintChangesRequest() ) @@ -28427,6 +28601,10 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.DiscardBlueprintChangesResponse() + post_with_metadata.return_value = ( + telcoautomation.DiscardBlueprintChangesResponse(), + metadata, + ) client.discard_blueprint_changes( request, @@ -28438,6 +28616,7 @@ def test_discard_blueprint_changes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_public_blueprints_rest_bad_request( @@ -28522,10 +28701,14 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_public_blueprints" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_public_blueprints_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_public_blueprints" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListPublicBlueprintsRequest.pb( telcoautomation.ListPublicBlueprintsRequest() ) @@ -28551,6 +28734,10 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListPublicBlueprintsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListPublicBlueprintsResponse(), + metadata, + ) client.list_public_blueprints( request, @@ -28562,6 +28749,7 @@ def test_list_public_blueprints_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_public_blueprint_rest_bad_request( @@ -28660,10 +28848,14 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_public_blueprint" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_public_blueprint_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_public_blueprint" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetPublicBlueprintRequest.pb( telcoautomation.GetPublicBlueprintRequest() ) @@ -28689,6 +28881,7 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.PublicBlueprint() + post_with_metadata.return_value = telcoautomation.PublicBlueprint(), metadata client.get_public_blueprint( request, @@ -28700,6 +28893,7 @@ def test_get_public_blueprint_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_deployment_rest_bad_request( @@ -28897,10 +29091,14 @@ def test_create_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_create_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_create_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_create_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.CreateDeploymentRequest.pb( telcoautomation.CreateDeploymentRequest() ) @@ -28924,6 +29122,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.create_deployment( request, @@ -28935,6 +29134,7 @@ def test_create_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_deployment_rest_bad_request( @@ -29136,10 +29336,14 @@ def test_update_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_update_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateDeploymentRequest.pb( telcoautomation.UpdateDeploymentRequest() ) @@ -29163,6 +29367,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.update_deployment( request, @@ -29174,6 +29379,7 @@ def test_update_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_deployment_rest_bad_request( @@ -29280,10 +29486,13 @@ def test_get_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_get_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetDeploymentRequest.pb( telcoautomation.GetDeploymentRequest() ) @@ -29307,6 +29516,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.get_deployment( request, @@ -29318,6 +29528,7 @@ def test_get_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_remove_deployment_rest_bad_request( @@ -29519,10 +29730,13 @@ def test_list_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_deployments" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_list_deployments_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListDeploymentsRequest.pb( telcoautomation.ListDeploymentsRequest() ) @@ -29548,6 +29762,10 @@ def test_list_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListDeploymentsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListDeploymentsResponse(), + metadata, + ) client.list_deployments( request, @@ -29559,6 +29777,7 @@ def test_list_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_deployment_revisions_rest_bad_request( @@ -29647,10 +29866,14 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_deployment_revisions" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_deployment_revisions_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_deployment_revisions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListDeploymentRevisionsRequest.pb( telcoautomation.ListDeploymentRevisionsRequest() ) @@ -29676,6 +29899,10 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListDeploymentRevisionsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListDeploymentRevisionsResponse(), + metadata, + ) client.list_deployment_revisions( request, @@ -29687,6 +29914,7 @@ def test_list_deployment_revisions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_discard_deployment_changes_rest_bad_request( @@ -29772,10 +30000,14 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_discard_deployment_changes" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_discard_deployment_changes_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_discard_deployment_changes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.DiscardDeploymentChangesRequest.pb( telcoautomation.DiscardDeploymentChangesRequest() ) @@ -29801,6 +30033,10 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.DiscardDeploymentChangesResponse() + post_with_metadata.return_value = ( + telcoautomation.DiscardDeploymentChangesResponse(), + metadata, + ) client.discard_deployment_changes( request, @@ -29812,6 +30048,7 @@ def test_discard_deployment_changes_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_deployment_rest_bad_request( @@ -29918,10 +30155,13 @@ def test_apply_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_apply_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, "post_apply_deployment_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_apply_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApplyDeploymentRequest.pb( telcoautomation.ApplyDeploymentRequest() ) @@ -29945,6 +30185,7 @@ def test_apply_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.apply_deployment( request, @@ -29956,6 +30197,7 @@ def test_apply_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_compute_deployment_status_rest_bad_request( @@ -30046,10 +30288,14 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_compute_deployment_status" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_compute_deployment_status_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_compute_deployment_status" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ComputeDeploymentStatusRequest.pb( telcoautomation.ComputeDeploymentStatusRequest() ) @@ -30075,6 +30321,10 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ComputeDeploymentStatusResponse() + post_with_metadata.return_value = ( + telcoautomation.ComputeDeploymentStatusResponse(), + metadata, + ) client.compute_deployment_status( request, @@ -30086,6 +30336,7 @@ def test_compute_deployment_status_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_rollback_deployment_rest_bad_request( @@ -30192,10 +30443,14 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_rollback_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_rollback_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_rollback_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.RollbackDeploymentRequest.pb( telcoautomation.RollbackDeploymentRequest() ) @@ -30219,6 +30474,7 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.Deployment() + post_with_metadata.return_value = telcoautomation.Deployment(), metadata client.rollback_deployment( request, @@ -30230,6 +30486,7 @@ def test_rollback_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_hydrated_deployment_rest_bad_request( @@ -30322,10 +30579,14 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_get_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_get_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_get_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.GetHydratedDeploymentRequest.pb( telcoautomation.GetHydratedDeploymentRequest() ) @@ -30351,6 +30612,7 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.get_hydrated_deployment( request, @@ -30362,6 +30624,7 @@ def test_get_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_hydrated_deployments_rest_bad_request( @@ -30450,10 +30713,14 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_list_hydrated_deployments" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_list_hydrated_deployments_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_list_hydrated_deployments" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ListHydratedDeploymentsRequest.pb( telcoautomation.ListHydratedDeploymentsRequest() ) @@ -30479,6 +30746,10 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.ListHydratedDeploymentsResponse() + post_with_metadata.return_value = ( + telcoautomation.ListHydratedDeploymentsResponse(), + metadata, + ) client.list_hydrated_deployments( request, @@ -30490,6 +30761,7 @@ def test_list_hydrated_deployments_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_hydrated_deployment_rest_bad_request( @@ -30668,10 +30940,14 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_update_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_update_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_update_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.UpdateHydratedDeploymentRequest.pb( telcoautomation.UpdateHydratedDeploymentRequest() ) @@ -30697,6 +30973,7 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.update_hydrated_deployment( request, @@ -30708,6 +30985,7 @@ def test_update_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_apply_hydrated_deployment_rest_bad_request( @@ -30800,10 +31078,14 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TelcoAutomationRestInterceptor, "post_apply_hydrated_deployment" ) as post, mock.patch.object( + transports.TelcoAutomationRestInterceptor, + "post_apply_hydrated_deployment_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TelcoAutomationRestInterceptor, "pre_apply_hydrated_deployment" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = telcoautomation.ApplyHydratedDeploymentRequest.pb( telcoautomation.ApplyHydratedDeploymentRequest() ) @@ -30829,6 +31111,7 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = telcoautomation.HydratedDeployment() + post_with_metadata.return_value = telcoautomation.HydratedDeployment(), metadata client.apply_hydrated_deployment( request, @@ -30840,6 +31123,7 @@ def test_apply_hydrated_deployment_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py index e4ff6d180bec..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.24.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py index e4ff6d180bec..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.24.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/client.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/client.py index 258fd712df2d..099f32ef8573 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/client.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/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 @@ -485,6 +487,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. @@ -1068,16 +1097,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1123,16 +1156,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py index 8f619b0473a2..9d2f87e28ed3 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech/transports/rest.py @@ -108,12 +108,35 @@ def post_list_voices( ) -> cloud_tts.ListVoicesResponse: """Post-rpc interceptor for list_voices - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_voices_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeech server but before - it is returned to user code. + it is returned to user code. This `post_list_voices` interceptor runs + before the `post_list_voices_with_metadata` interceptor. """ return response + def post_list_voices_with_metadata( + self, + response: cloud_tts.ListVoicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tts.ListVoicesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_voices + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeech server but before it is returned to user code. + + We recommend only using this `post_list_voices_with_metadata` + interceptor in new development instead of the `post_list_voices` interceptor. + When both interceptors are used, this `post_list_voices_with_metadata` interceptor runs after the + `post_list_voices` interceptor. The (possibly modified) response returned by + `post_list_voices` will be passed to + `post_list_voices_with_metadata`. + """ + return response, metadata + def pre_synthesize_speech( self, request: cloud_tts.SynthesizeSpeechRequest, @@ -133,12 +156,37 @@ def post_synthesize_speech( ) -> cloud_tts.SynthesizeSpeechResponse: """Post-rpc interceptor for synthesize_speech - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_synthesize_speech_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeech server but before - it is returned to user code. + it is returned to user code. This `post_synthesize_speech` interceptor runs + before the `post_synthesize_speech_with_metadata` interceptor. """ return response + def post_synthesize_speech_with_metadata( + self, + response: cloud_tts.SynthesizeSpeechResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tts.SynthesizeSpeechResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for synthesize_speech + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeech server but before it is returned to user code. + + We recommend only using this `post_synthesize_speech_with_metadata` + interceptor in new development instead of the `post_synthesize_speech` interceptor. + When both interceptors are used, this `post_synthesize_speech_with_metadata` interceptor runs after the + `post_synthesize_speech` interceptor. The (possibly modified) response returned by + `post_synthesize_speech` will be passed to + `post_synthesize_speech_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -404,6 +452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_voices(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_voices_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -573,6 +625,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_synthesize_speech(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_synthesize_speech_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py index 027ba7ffe7e7..b2c64571ec29 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/client.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/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 @@ -496,6 +498,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. @@ -877,16 +906,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -932,16 +965,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py index 831b35a7a3bc..3a149955fb3c 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -103,12 +103,35 @@ def post_synthesize_long_audio( ) -> operations_pb2.Operation: """Post-rpc interceptor for synthesize_long_audio - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_synthesize_long_audio_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. + it is returned to user code. This `post_synthesize_long_audio` interceptor runs + before the `post_synthesize_long_audio_with_metadata` interceptor. """ return response + def post_synthesize_long_audio_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for synthesize_long_audio + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeechLongAudioSynthesize server but before it is returned to user code. + + We recommend only using this `post_synthesize_long_audio_with_metadata` + interceptor in new development instead of the `post_synthesize_long_audio` interceptor. + When both interceptors are used, this `post_synthesize_long_audio_with_metadata` interceptor runs after the + `post_synthesize_long_audio` interceptor. The (possibly modified) response returned by + `post_synthesize_long_audio` will be passed to + `post_synthesize_long_audio_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -425,6 +448,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_synthesize_long_audio(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_synthesize_long_audio_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py index e4ff6d180bec..558c8aab67c5 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "2.24.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py index 57307785ec6f..c59a209b712a 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/client.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/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 @@ -485,6 +487,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. @@ -1068,16 +1097,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -1123,16 +1156,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py index 40de85a5479e..91d73ec9ee95 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech/transports/rest.py @@ -108,12 +108,35 @@ def post_list_voices( ) -> cloud_tts.ListVoicesResponse: """Post-rpc interceptor for list_voices - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_voices_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeech server but before - it is returned to user code. + it is returned to user code. This `post_list_voices` interceptor runs + before the `post_list_voices_with_metadata` interceptor. """ return response + def post_list_voices_with_metadata( + self, + response: cloud_tts.ListVoicesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tts.ListVoicesResponse, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for list_voices + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeech server but before it is returned to user code. + + We recommend only using this `post_list_voices_with_metadata` + interceptor in new development instead of the `post_list_voices` interceptor. + When both interceptors are used, this `post_list_voices_with_metadata` interceptor runs after the + `post_list_voices` interceptor. The (possibly modified) response returned by + `post_list_voices` will be passed to + `post_list_voices_with_metadata`. + """ + return response, metadata + def pre_synthesize_speech( self, request: cloud_tts.SynthesizeSpeechRequest, @@ -133,12 +156,37 @@ def post_synthesize_speech( ) -> cloud_tts.SynthesizeSpeechResponse: """Post-rpc interceptor for synthesize_speech - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_synthesize_speech_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeech server but before - it is returned to user code. + it is returned to user code. This `post_synthesize_speech` interceptor runs + before the `post_synthesize_speech_with_metadata` interceptor. """ return response + def post_synthesize_speech_with_metadata( + self, + response: cloud_tts.SynthesizeSpeechResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tts.SynthesizeSpeechResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for synthesize_speech + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeech server but before it is returned to user code. + + We recommend only using this `post_synthesize_speech_with_metadata` + interceptor in new development instead of the `post_synthesize_speech` interceptor. + When both interceptors are used, this `post_synthesize_speech_with_metadata` interceptor runs after the + `post_synthesize_speech` interceptor. The (possibly modified) response returned by + `post_synthesize_speech` will be passed to + `post_synthesize_speech_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -404,6 +452,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_voices(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_voices_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -573,6 +625,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_synthesize_speech(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_synthesize_speech_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py index 38ea42c5af3d..400ea5977d7d 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/client.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/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 @@ -496,6 +498,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. @@ -877,16 +906,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -932,16 +965,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py index ee531ecb80c6..00f9757a5ab9 100644 --- a/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py +++ b/packages/google-cloud-texttospeech/google/cloud/texttospeech_v1beta1/services/text_to_speech_long_audio_synthesize/transports/rest.py @@ -103,12 +103,35 @@ def post_synthesize_long_audio( ) -> operations_pb2.Operation: """Post-rpc interceptor for synthesize_long_audio - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_synthesize_long_audio_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the TextToSpeechLongAudioSynthesize server but before - it is returned to user code. + it is returned to user code. This `post_synthesize_long_audio` interceptor runs + before the `post_synthesize_long_audio_with_metadata` interceptor. """ return response + def post_synthesize_long_audio_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for synthesize_long_audio + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the TextToSpeechLongAudioSynthesize server but before it is returned to user code. + + We recommend only using this `post_synthesize_long_audio_with_metadata` + interceptor in new development instead of the `post_synthesize_long_audio` interceptor. + When both interceptors are used, this `post_synthesize_long_audio_with_metadata` interceptor runs after the + `post_synthesize_long_audio` interceptor. The (possibly modified) response returned by + `post_synthesize_long_audio` will be passed to + `post_synthesize_long_audio_with_metadata`. + """ + return response, metadata + def pre_get_operation( self, request: operations_pb2.GetOperationRequest, @@ -425,6 +448,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_synthesize_long_audio(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_synthesize_long_audio_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json index 9a96c02acc04..5b86979204f3 100644 --- a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json +++ b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-texttospeech", - "version": "2.24.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json index fa2dd3aab66f..1494a35ba1c6 100644 --- a/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json +++ b/packages/google-cloud-texttospeech/samples/generated_samples/snippet_metadata_google.cloud.texttospeech.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-texttospeech", - "version": "2.24.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py index 59f0c9da2b71..4d3576fb8d81 100644 --- a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py +++ b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech.py @@ -60,6 +60,13 @@ ) from google.cloud.texttospeech_v1.types import cloud_tts +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 @@ -303,6 +310,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 = TextToSpeechClient(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 = TextToSpeechClient(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", [ @@ -2359,10 +2409,13 @@ def test_list_voices_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextToSpeechRestInterceptor, "post_list_voices" ) as post, mock.patch.object( + transports.TextToSpeechRestInterceptor, "post_list_voices_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechRestInterceptor, "pre_list_voices" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) transcode.return_value = { "method": "post", @@ -2386,6 +2439,7 @@ def test_list_voices_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tts.ListVoicesResponse() + post_with_metadata.return_value = cloud_tts.ListVoicesResponse(), metadata client.list_voices( request, @@ -2397,6 +2451,7 @@ def test_list_voices_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_synthesize_speech_rest_bad_request( @@ -2481,10 +2536,13 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextToSpeechRestInterceptor, "post_synthesize_speech" ) as post, mock.patch.object( + transports.TextToSpeechRestInterceptor, "post_synthesize_speech_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechRestInterceptor, "pre_synthesize_speech" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts.SynthesizeSpeechRequest.pb( cloud_tts.SynthesizeSpeechRequest() ) @@ -2510,6 +2568,7 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tts.SynthesizeSpeechResponse() + post_with_metadata.return_value = cloud_tts.SynthesizeSpeechResponse(), metadata client.synthesize_speech( request, @@ -2521,6 +2580,7 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_streaming_synthesize_rest_error(): diff --git a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py index dd83bbcac9f8..4950b628edb4 100644 --- a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py +++ b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1/test_text_to_speech_long_audio_synthesize.py @@ -69,6 +69,13 @@ ) from google.cloud.texttospeech_v1.types import cloud_tts, cloud_tts_lrs +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 @@ -363,6 +370,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 = TextToSpeechLongAudioSynthesizeClient(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 = TextToSpeechLongAudioSynthesizeClient(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", [ @@ -1821,11 +1871,15 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio", ) as post, mock.patch.object( + transports.TextToSpeechLongAudioSynthesizeRestInterceptor, + "post_synthesize_long_audio_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb( cloud_tts_lrs.SynthesizeLongAudioRequest() ) @@ -1849,6 +1903,7 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.synthesize_long_audio( request, @@ -1860,6 +1915,7 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py index 9583633352a2..47e5082b4ea1 100644 --- a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py +++ b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech.py @@ -60,6 +60,13 @@ ) from google.cloud.texttospeech_v1beta1.types import cloud_tts +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 @@ -303,6 +310,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 = TextToSpeechClient(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 = TextToSpeechClient(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", [ @@ -2361,10 +2411,13 @@ def test_list_voices_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextToSpeechRestInterceptor, "post_list_voices" ) as post, mock.patch.object( + transports.TextToSpeechRestInterceptor, "post_list_voices_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechRestInterceptor, "pre_list_voices" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts.ListVoicesRequest.pb(cloud_tts.ListVoicesRequest()) transcode.return_value = { "method": "post", @@ -2388,6 +2441,7 @@ def test_list_voices_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tts.ListVoicesResponse() + post_with_metadata.return_value = cloud_tts.ListVoicesResponse(), metadata client.list_voices( request, @@ -2399,6 +2453,7 @@ def test_list_voices_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_synthesize_speech_rest_bad_request( @@ -2483,10 +2538,13 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TextToSpeechRestInterceptor, "post_synthesize_speech" ) as post, mock.patch.object( + transports.TextToSpeechRestInterceptor, "post_synthesize_speech_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechRestInterceptor, "pre_synthesize_speech" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts.SynthesizeSpeechRequest.pb( cloud_tts.SynthesizeSpeechRequest() ) @@ -2512,6 +2570,7 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tts.SynthesizeSpeechResponse() + post_with_metadata.return_value = cloud_tts.SynthesizeSpeechResponse(), metadata client.synthesize_speech( request, @@ -2523,6 +2582,7 @@ def test_synthesize_speech_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_streaming_synthesize_rest_error(): diff --git a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py index 8ed392394293..23d7d6544e4f 100644 --- a/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py +++ b/packages/google-cloud-texttospeech/tests/unit/gapic/texttospeech_v1beta1/test_text_to_speech_long_audio_synthesize.py @@ -69,6 +69,13 @@ ) from google.cloud.texttospeech_v1beta1.types import cloud_tts, cloud_tts_lrs +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 @@ -363,6 +370,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 = TextToSpeechLongAudioSynthesizeClient(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 = TextToSpeechLongAudioSynthesizeClient(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", [ @@ -1821,11 +1871,15 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "post_synthesize_long_audio", ) as post, mock.patch.object( + transports.TextToSpeechLongAudioSynthesizeRestInterceptor, + "post_synthesize_long_audio_with_metadata", + ) as post_with_metadata, mock.patch.object( transports.TextToSpeechLongAudioSynthesizeRestInterceptor, "pre_synthesize_long_audio", ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tts_lrs.SynthesizeLongAudioRequest.pb( cloud_tts_lrs.SynthesizeLongAudioRequest() ) @@ -1849,6 +1903,7 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.synthesize_long_audio( request, @@ -1860,6 +1915,7 @@ def test_synthesize_long_audio_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_operation_rest_bad_request( diff --git a/packages/google-cloud-tpu/google/cloud/tpu/gapic_version.py b/packages/google-cloud-tpu/google/cloud/tpu/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu/gapic_version.py +++ b/packages/google-cloud-tpu/google/cloud/tpu/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v1/gapic_version.py b/packages/google-cloud-tpu/google/cloud/tpu_v1/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v1/gapic_version.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v1/services/tpu/client.py b/packages/google-cloud-tpu/google/cloud/tpu_v1/services/tpu/client.py index 95e06b1d5f5a..34d808501271 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v1/services/tpu/client.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v1/services/tpu/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 @@ -533,6 +535,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. @@ -1990,16 +2019,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2045,16 +2078,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -2211,16 +2248,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -2266,16 +2307,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v2/gapic_version.py b/packages/google-cloud-tpu/google/cloud/tpu_v2/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v2/gapic_version.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v2/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/client.py b/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/client.py index 74c58c498793..2131340dc191 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/client.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/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 @@ -559,6 +561,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. @@ -2836,16 +2865,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -2891,16 +2924,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -3057,16 +3094,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3112,16 +3153,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/transports/rest.py b/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/transports/rest.py index 36e14909f812..4849520c32fb 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/transports/rest.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v2/services/tpu/transports/rest.py @@ -237,12 +237,35 @@ def post_create_node( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_create_node` interceptor runs + before the `post_create_node_with_metadata` interceptor. """ return response + def post_create_node_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_create_node_with_metadata` + interceptor in new development instead of the `post_create_node` interceptor. + When both interceptors are used, this `post_create_node_with_metadata` interceptor runs after the + `post_create_node` interceptor. The (possibly modified) response returned by + `post_create_node` will be passed to + `post_create_node_with_metadata`. + """ + return response, metadata + def pre_create_queued_resource( self, request: cloud_tpu.CreateQueuedResourceRequest, @@ -262,12 +285,35 @@ def post_create_queued_resource( ) -> operations_pb2.Operation: """Post-rpc interceptor for create_queued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_create_queued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_create_queued_resource` interceptor runs + before the `post_create_queued_resource_with_metadata` interceptor. """ return response + def post_create_queued_resource_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for create_queued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_create_queued_resource_with_metadata` + interceptor in new development instead of the `post_create_queued_resource` interceptor. + When both interceptors are used, this `post_create_queued_resource_with_metadata` interceptor runs after the + `post_create_queued_resource` interceptor. The (possibly modified) response returned by + `post_create_queued_resource` will be passed to + `post_create_queued_resource_with_metadata`. + """ + return response, metadata + def pre_delete_node( self, request: cloud_tpu.DeleteNodeRequest, @@ -285,12 +331,35 @@ def post_delete_node( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_delete_node` interceptor runs + before the `post_delete_node_with_metadata` interceptor. """ return response + def post_delete_node_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_delete_node_with_metadata` + interceptor in new development instead of the `post_delete_node` interceptor. + When both interceptors are used, this `post_delete_node_with_metadata` interceptor runs after the + `post_delete_node` interceptor. The (possibly modified) response returned by + `post_delete_node` will be passed to + `post_delete_node_with_metadata`. + """ + return response, metadata + def pre_delete_queued_resource( self, request: cloud_tpu.DeleteQueuedResourceRequest, @@ -310,12 +379,35 @@ def post_delete_queued_resource( ) -> operations_pb2.Operation: """Post-rpc interceptor for delete_queued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_delete_queued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_delete_queued_resource` interceptor runs + before the `post_delete_queued_resource_with_metadata` interceptor. """ return response + def post_delete_queued_resource_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for delete_queued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_delete_queued_resource_with_metadata` + interceptor in new development instead of the `post_delete_queued_resource` interceptor. + When both interceptors are used, this `post_delete_queued_resource_with_metadata` interceptor runs after the + `post_delete_queued_resource` interceptor. The (possibly modified) response returned by + `post_delete_queued_resource` will be passed to + `post_delete_queued_resource_with_metadata`. + """ + return response, metadata + def pre_generate_service_identity( self, request: cloud_tpu.GenerateServiceIdentityRequest, @@ -336,12 +428,38 @@ def post_generate_service_identity( ) -> cloud_tpu.GenerateServiceIdentityResponse: """Post-rpc interceptor for generate_service_identity - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_generate_service_identity_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_generate_service_identity` interceptor runs + before the `post_generate_service_identity_with_metadata` interceptor. """ return response + def post_generate_service_identity_with_metadata( + self, + response: cloud_tpu.GenerateServiceIdentityResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tpu.GenerateServiceIdentityResponse, + Sequence[Tuple[str, Union[str, bytes]]], + ]: + """Post-rpc interceptor for generate_service_identity + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_generate_service_identity_with_metadata` + interceptor in new development instead of the `post_generate_service_identity` interceptor. + When both interceptors are used, this `post_generate_service_identity_with_metadata` interceptor runs after the + `post_generate_service_identity` interceptor. The (possibly modified) response returned by + `post_generate_service_identity` will be passed to + `post_generate_service_identity_with_metadata`. + """ + return response, metadata + def pre_get_accelerator_type( self, request: cloud_tpu.GetAcceleratorTypeRequest, @@ -361,12 +479,35 @@ def post_get_accelerator_type( ) -> cloud_tpu.AcceleratorType: """Post-rpc interceptor for get_accelerator_type - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_accelerator_type_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_get_accelerator_type` interceptor runs + before the `post_get_accelerator_type_with_metadata` interceptor. """ return response + def post_get_accelerator_type_with_metadata( + self, + response: cloud_tpu.AcceleratorType, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tpu.AcceleratorType, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_accelerator_type + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_get_accelerator_type_with_metadata` + interceptor in new development instead of the `post_get_accelerator_type` interceptor. + When both interceptors are used, this `post_get_accelerator_type_with_metadata` interceptor runs after the + `post_get_accelerator_type` interceptor. The (possibly modified) response returned by + `post_get_accelerator_type` will be passed to + `post_get_accelerator_type_with_metadata`. + """ + return response, metadata + def pre_get_guest_attributes( self, request: cloud_tpu.GetGuestAttributesRequest, @@ -386,12 +527,37 @@ def post_get_guest_attributes( ) -> cloud_tpu.GetGuestAttributesResponse: """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 Tpu 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: cloud_tpu.GetGuestAttributesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tpu.GetGuestAttributesResponse, 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 Tpu 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_node( self, request: cloud_tpu.GetNodeRequest, @@ -407,12 +573,35 @@ def pre_get_node( def post_get_node(self, response: cloud_tpu.Node) -> cloud_tpu.Node: """Post-rpc interceptor for get_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_get_node` interceptor runs + before the `post_get_node_with_metadata` interceptor. """ return response + def post_get_node_with_metadata( + self, + response: cloud_tpu.Node, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tpu.Node, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_get_node_with_metadata` + interceptor in new development instead of the `post_get_node` interceptor. + When both interceptors are used, this `post_get_node_with_metadata` interceptor runs after the + `post_get_node` interceptor. The (possibly modified) response returned by + `post_get_node` will be passed to + `post_get_node_with_metadata`. + """ + return response, metadata + def pre_get_queued_resource( self, request: cloud_tpu.GetQueuedResourceRequest, @@ -432,12 +621,35 @@ def post_get_queued_resource( ) -> cloud_tpu.QueuedResource: """Post-rpc interceptor for get_queued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_queued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_get_queued_resource` interceptor runs + before the `post_get_queued_resource_with_metadata` interceptor. """ return response + def post_get_queued_resource_with_metadata( + self, + response: cloud_tpu.QueuedResource, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tpu.QueuedResource, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_queued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_get_queued_resource_with_metadata` + interceptor in new development instead of the `post_get_queued_resource` interceptor. + When both interceptors are used, this `post_get_queued_resource_with_metadata` interceptor runs after the + `post_get_queued_resource` interceptor. The (possibly modified) response returned by + `post_get_queued_resource` will be passed to + `post_get_queued_resource_with_metadata`. + """ + return response, metadata + def pre_get_runtime_version( self, request: cloud_tpu.GetRuntimeVersionRequest, @@ -457,12 +669,35 @@ def post_get_runtime_version( ) -> cloud_tpu.RuntimeVersion: """Post-rpc interceptor for get_runtime_version - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_get_runtime_version_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_get_runtime_version` interceptor runs + before the `post_get_runtime_version_with_metadata` interceptor. """ return response + def post_get_runtime_version_with_metadata( + self, + response: cloud_tpu.RuntimeVersion, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tpu.RuntimeVersion, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for get_runtime_version + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_get_runtime_version_with_metadata` + interceptor in new development instead of the `post_get_runtime_version` interceptor. + When both interceptors are used, this `post_get_runtime_version_with_metadata` interceptor runs after the + `post_get_runtime_version` interceptor. The (possibly modified) response returned by + `post_get_runtime_version` will be passed to + `post_get_runtime_version_with_metadata`. + """ + return response, metadata + def pre_list_accelerator_types( self, request: cloud_tpu.ListAcceleratorTypesRequest, @@ -482,12 +717,37 @@ def post_list_accelerator_types( ) -> cloud_tpu.ListAcceleratorTypesResponse: """Post-rpc interceptor for list_accelerator_types - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_accelerator_types_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_list_accelerator_types` interceptor runs + before the `post_list_accelerator_types_with_metadata` interceptor. """ return response + def post_list_accelerator_types_with_metadata( + self, + response: cloud_tpu.ListAcceleratorTypesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tpu.ListAcceleratorTypesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_accelerator_types + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_list_accelerator_types_with_metadata` + interceptor in new development instead of the `post_list_accelerator_types` interceptor. + When both interceptors are used, this `post_list_accelerator_types_with_metadata` interceptor runs after the + `post_list_accelerator_types` interceptor. The (possibly modified) response returned by + `post_list_accelerator_types` will be passed to + `post_list_accelerator_types_with_metadata`. + """ + return response, metadata + def pre_list_nodes( self, request: cloud_tpu.ListNodesRequest, @@ -505,12 +765,35 @@ def post_list_nodes( ) -> cloud_tpu.ListNodesResponse: """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 Tpu 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: cloud_tpu.ListNodesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[cloud_tpu.ListNodesResponse, 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 Tpu 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_list_queued_resources( self, request: cloud_tpu.ListQueuedResourcesRequest, @@ -530,12 +813,37 @@ def post_list_queued_resources( ) -> cloud_tpu.ListQueuedResourcesResponse: """Post-rpc interceptor for list_queued_resources - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_queued_resources_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_list_queued_resources` interceptor runs + before the `post_list_queued_resources_with_metadata` interceptor. """ return response + def post_list_queued_resources_with_metadata( + self, + response: cloud_tpu.ListQueuedResourcesResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tpu.ListQueuedResourcesResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_queued_resources + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_list_queued_resources_with_metadata` + interceptor in new development instead of the `post_list_queued_resources` interceptor. + When both interceptors are used, this `post_list_queued_resources_with_metadata` interceptor runs after the + `post_list_queued_resources` interceptor. The (possibly modified) response returned by + `post_list_queued_resources` will be passed to + `post_list_queued_resources_with_metadata`. + """ + return response, metadata + def pre_list_runtime_versions( self, request: cloud_tpu.ListRuntimeVersionsRequest, @@ -555,12 +863,37 @@ def post_list_runtime_versions( ) -> cloud_tpu.ListRuntimeVersionsResponse: """Post-rpc interceptor for list_runtime_versions - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_list_runtime_versions_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_list_runtime_versions` interceptor runs + before the `post_list_runtime_versions_with_metadata` interceptor. """ return response + def post_list_runtime_versions_with_metadata( + self, + response: cloud_tpu.ListRuntimeVersionsResponse, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[ + cloud_tpu.ListRuntimeVersionsResponse, Sequence[Tuple[str, Union[str, bytes]]] + ]: + """Post-rpc interceptor for list_runtime_versions + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_list_runtime_versions_with_metadata` + interceptor in new development instead of the `post_list_runtime_versions` interceptor. + When both interceptors are used, this `post_list_runtime_versions_with_metadata` interceptor runs after the + `post_list_runtime_versions` interceptor. The (possibly modified) response returned by + `post_list_runtime_versions` will be passed to + `post_list_runtime_versions_with_metadata`. + """ + return response, metadata + def pre_reset_queued_resource( self, request: cloud_tpu.ResetQueuedResourceRequest, @@ -580,12 +913,35 @@ def post_reset_queued_resource( ) -> operations_pb2.Operation: """Post-rpc interceptor for reset_queued_resource - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_reset_queued_resource_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_reset_queued_resource` interceptor runs + before the `post_reset_queued_resource_with_metadata` interceptor. """ return response + def post_reset_queued_resource_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for reset_queued_resource + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_reset_queued_resource_with_metadata` + interceptor in new development instead of the `post_reset_queued_resource` interceptor. + When both interceptors are used, this `post_reset_queued_resource_with_metadata` interceptor runs after the + `post_reset_queued_resource` interceptor. The (possibly modified) response returned by + `post_reset_queued_resource` will be passed to + `post_reset_queued_resource_with_metadata`. + """ + return response, metadata + def pre_start_node( self, request: cloud_tpu.StartNodeRequest, @@ -603,12 +959,35 @@ def post_start_node( ) -> operations_pb2.Operation: """Post-rpc interceptor for start_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_start_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_start_node` interceptor runs + before the `post_start_node_with_metadata` interceptor. """ return response + def post_start_node_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for start_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_start_node_with_metadata` + interceptor in new development instead of the `post_start_node` interceptor. + When both interceptors are used, this `post_start_node_with_metadata` interceptor runs after the + `post_start_node` interceptor. The (possibly modified) response returned by + `post_start_node` will be passed to + `post_start_node_with_metadata`. + """ + return response, metadata + def pre_stop_node( self, request: cloud_tpu.StopNodeRequest, @@ -626,12 +1005,35 @@ def post_stop_node( ) -> operations_pb2.Operation: """Post-rpc interceptor for stop_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_stop_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_stop_node` interceptor runs + before the `post_stop_node_with_metadata` interceptor. """ return response + def post_stop_node_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for stop_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_stop_node_with_metadata` + interceptor in new development instead of the `post_stop_node` interceptor. + When both interceptors are used, this `post_stop_node_with_metadata` interceptor runs after the + `post_stop_node` interceptor. The (possibly modified) response returned by + `post_stop_node` will be passed to + `post_stop_node_with_metadata`. + """ + return response, metadata + def pre_update_node( self, request: cloud_tpu.UpdateNodeRequest, @@ -649,12 +1051,35 @@ def post_update_node( ) -> operations_pb2.Operation: """Post-rpc interceptor for update_node - Override in a subclass to manipulate the response + DEPRECATED. Please use the `post_update_node_with_metadata` + interceptor instead. + + Override in a subclass to read or manipulate the response after it is returned by the Tpu server but before - it is returned to user code. + it is returned to user code. This `post_update_node` interceptor runs + before the `post_update_node_with_metadata` interceptor. """ return response + def post_update_node_with_metadata( + self, + response: operations_pb2.Operation, + metadata: Sequence[Tuple[str, Union[str, bytes]]], + ) -> Tuple[operations_pb2.Operation, Sequence[Tuple[str, Union[str, bytes]]]]: + """Post-rpc interceptor for update_node + + Override in a subclass to read or manipulate the response or metadata after it + is returned by the Tpu server but before it is returned to user code. + + We recommend only using this `post_update_node_with_metadata` + interceptor in new development instead of the `post_update_node` interceptor. + When both interceptors are used, this `post_update_node_with_metadata` interceptor runs after the + `post_update_node` interceptor. The (possibly modified) response returned by + `post_update_node` will be passed to + `post_update_node_with_metadata`. + """ + return response, metadata + def pre_get_location( self, request: locations_pb2.GetLocationRequest, @@ -1066,6 +1491,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1222,6 +1651,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_create_queued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_create_queued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1362,6 +1795,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1510,6 +1947,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_delete_queued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_delete_queued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1661,6 +2102,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_generate_service_identity(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_generate_service_identity_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1812,6 +2257,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_accelerator_type(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_accelerator_type_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -1967,6 +2416,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 @@ -2107,6 +2560,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2256,6 +2713,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_queued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_queued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2403,6 +2864,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_get_runtime_version(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_get_runtime_version_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2552,6 +3017,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_accelerator_types(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_accelerator_types_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2695,6 +3164,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 @@ -2844,6 +3317,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_queued_resources(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_queued_resources_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -2995,6 +3472,10 @@ def __call__( json_format.Parse(response.content, pb_resp, ignore_unknown_fields=True) resp = self._interceptor.post_list_runtime_versions(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_list_runtime_versions_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3153,6 +3634,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_reset_queued_resource(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_reset_queued_resource_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3299,6 +3784,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_start_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_start_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3445,6 +3934,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_stop_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_stop_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER @@ -3591,6 +4084,10 @@ def __call__( json_format.Parse(response.content, resp, ignore_unknown_fields=True) resp = self._interceptor.post_update_node(resp) + response_metadata = [(k, str(v)) for k, v in response.headers.items()] + resp, _ = self._interceptor.post_update_node_with_metadata( + resp, response_metadata + ) if CLIENT_LOGGING_SUPPORTED and _LOGGER.isEnabledFor( logging.DEBUG ): # pragma: NO COVER diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/gapic_version.py b/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/gapic_version.py index 8b80cf328714..558c8aab67c5 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/gapic_version.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.22.0" # {x-release-please-version} +__version__ = "0.0.0" # {x-release-please-version} diff --git a/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/services/tpu/client.py b/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/services/tpu/client.py index 1607efd2d7f6..d51a6bbc90b9 100644 --- a/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/services/tpu/client.py +++ b/packages/google-cloud-tpu/google/cloud/tpu_v2alpha1/services/tpu/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 @@ -581,6 +583,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. @@ -3262,16 +3291,20 @@ def list_operations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def get_operation( self, @@ -3317,16 +3350,20 @@ def get_operation( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def delete_operation( self, @@ -3483,16 +3520,20 @@ def get_location( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e def list_locations( self, @@ -3538,16 +3579,20 @@ def list_locations( # Validate the universe domain. self._validate_universe_domain() - # Send the request. - response = rpc( - request, - retry=retry, - timeout=timeout, - metadata=metadata, - ) + try: + # Send the request. + response = rpc( + request, + retry=retry, + timeout=timeout, + metadata=metadata, + ) - # Done; return the response. - return response + # Done; return the response. + return response + except core_exceptions.GoogleAPICallError as e: + self._add_cred_info_for_auth_errors(e) + raise e DEFAULT_CLIENT_INFO = gapic_v1.client_info.ClientInfo( diff --git a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v1.json b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v1.json index 4bcd70537700..0c1dfa7ef851 100644 --- a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v1.json +++ b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tpu", - "version": "1.22.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2.json b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2.json index bac6e4cd5e97..bca59a74df6e 100644 --- a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2.json +++ b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tpu", - "version": "1.22.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2alpha1.json b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2alpha1.json index 449744edf6c7..760d92d2f8bc 100644 --- a/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2alpha1.json +++ b/packages/google-cloud-tpu/samples/generated_samples/snippet_metadata_google.cloud.tpu.v2alpha1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-tpu", - "version": "1.22.0" + "version": "0.1.0" }, "snippets": [ { diff --git a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v1/test_tpu.py b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v1/test_tpu.py index 15aa41efe336..3332bb2b92ed 100644 --- a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v1/test_tpu.py +++ b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v1/test_tpu.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -67,6 +68,13 @@ ) from google.cloud.tpu_v1.types import cloud_tpu +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 @@ -278,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 = TpuClient(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 = TpuClient(credentials=cred) + client._transport._credentials = cred + + error = core_exceptions.GoogleAPICallError("message", details=[]) + error.code = error_code + + client._add_cred_info_for_auth_errors(error) + assert error.details == [] + + @pytest.mark.parametrize( "client_class,transport_name", [ diff --git a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2/test_tpu.py b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2/test_tpu.py index 483c6e0b270f..d5aa3ebfbe49 100644 --- a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2/test_tpu.py +++ b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2/test_tpu.py @@ -78,6 +78,13 @@ ) from google.cloud.tpu_v2.types import cloud_tpu +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 @@ -289,6 +296,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 = TpuClient(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 = TpuClient(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", [ @@ -12133,10 +12183,13 @@ def test_list_nodes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_list_nodes" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_list_nodes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_list_nodes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.ListNodesRequest.pb(cloud_tpu.ListNodesRequest()) transcode.return_value = { "method": "post", @@ -12160,6 +12213,7 @@ def test_list_nodes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.ListNodesResponse() + post_with_metadata.return_value = cloud_tpu.ListNodesResponse(), metadata client.list_nodes( request, @@ -12171,6 +12225,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_get_node_rest_bad_request(request_type=cloud_tpu.GetNodeRequest): @@ -12275,10 +12330,13 @@ def test_get_node_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_get_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_get_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_get_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GetNodeRequest.pb(cloud_tpu.GetNodeRequest()) transcode.return_value = { "method": "post", @@ -12300,6 +12358,7 @@ def test_get_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.Node() + post_with_metadata.return_value = cloud_tpu.Node(), metadata client.get_node( request, @@ -12311,6 +12370,7 @@ def test_get_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_node_rest_bad_request(request_type=cloud_tpu.CreateNodeRequest): @@ -12503,10 +12563,13 @@ def test_create_node_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_create_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_create_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_create_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.CreateNodeRequest.pb(cloud_tpu.CreateNodeRequest()) transcode.return_value = { "method": "post", @@ -12528,6 +12591,7 @@ def test_create_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_node( request, @@ -12539,6 +12603,7 @@ def test_create_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_node_rest_bad_request(request_type=cloud_tpu.DeleteNodeRequest): @@ -12615,10 +12680,13 @@ def test_delete_node_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_delete_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_delete_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_delete_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.DeleteNodeRequest.pb(cloud_tpu.DeleteNodeRequest()) transcode.return_value = { "method": "post", @@ -12640,6 +12708,7 @@ def test_delete_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_node( request, @@ -12651,6 +12720,7 @@ def test_delete_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_stop_node_rest_bad_request(request_type=cloud_tpu.StopNodeRequest): @@ -12727,10 +12797,13 @@ def test_stop_node_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_stop_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_stop_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_stop_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.StopNodeRequest.pb(cloud_tpu.StopNodeRequest()) transcode.return_value = { "method": "post", @@ -12752,6 +12825,7 @@ def test_stop_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.stop_node( request, @@ -12763,6 +12837,7 @@ def test_stop_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_start_node_rest_bad_request(request_type=cloud_tpu.StartNodeRequest): @@ -12839,10 +12914,13 @@ def test_start_node_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_start_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_start_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_start_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.StartNodeRequest.pb(cloud_tpu.StartNodeRequest()) transcode.return_value = { "method": "post", @@ -12864,6 +12942,7 @@ def test_start_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.start_node( request, @@ -12875,6 +12954,7 @@ def test_start_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_update_node_rest_bad_request(request_type=cloud_tpu.UpdateNodeRequest): @@ -13071,10 +13151,13 @@ def test_update_node_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_update_node" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_update_node_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_update_node" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.UpdateNodeRequest.pb(cloud_tpu.UpdateNodeRequest()) transcode.return_value = { "method": "post", @@ -13096,6 +13179,7 @@ def test_update_node_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.update_node( request, @@ -13107,6 +13191,7 @@ def test_update_node_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_queued_resources_rest_bad_request( @@ -13191,10 +13276,13 @@ def test_list_queued_resources_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_list_queued_resources" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_list_queued_resources_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_list_queued_resources" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.ListQueuedResourcesRequest.pb( cloud_tpu.ListQueuedResourcesRequest() ) @@ -13220,6 +13308,10 @@ def test_list_queued_resources_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.ListQueuedResourcesResponse() + post_with_metadata.return_value = ( + cloud_tpu.ListQueuedResourcesResponse(), + metadata, + ) client.list_queued_resources( request, @@ -13231,6 +13323,7 @@ def test_list_queued_resources_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_queued_resource_rest_bad_request( @@ -13319,10 +13412,13 @@ def test_get_queued_resource_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_get_queued_resource" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_get_queued_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_get_queued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GetQueuedResourceRequest.pb( cloud_tpu.GetQueuedResourceRequest() ) @@ -13346,6 +13442,7 @@ def test_get_queued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.QueuedResource() + post_with_metadata.return_value = cloud_tpu.QueuedResource(), metadata client.get_queued_resource( request, @@ -13357,6 +13454,7 @@ def test_get_queued_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_create_queued_resource_rest_bad_request( @@ -13607,10 +13705,13 @@ def test_create_queued_resource_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_create_queued_resource" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_create_queued_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_create_queued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.CreateQueuedResourceRequest.pb( cloud_tpu.CreateQueuedResourceRequest() ) @@ -13634,6 +13735,7 @@ def test_create_queued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.create_queued_resource( request, @@ -13645,6 +13747,7 @@ def test_create_queued_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_delete_queued_resource_rest_bad_request( @@ -13727,10 +13830,13 @@ def test_delete_queued_resource_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_delete_queued_resource" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_delete_queued_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_delete_queued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.DeleteQueuedResourceRequest.pb( cloud_tpu.DeleteQueuedResourceRequest() ) @@ -13754,6 +13860,7 @@ def test_delete_queued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.delete_queued_resource( request, @@ -13765,6 +13872,7 @@ def test_delete_queued_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_reset_queued_resource_rest_bad_request( @@ -13847,10 +13955,13 @@ def test_reset_queued_resource_rest_interceptors(null_interceptor): ), mock.patch.object( transports.TpuRestInterceptor, "post_reset_queued_resource" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_reset_queued_resource_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_reset_queued_resource" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.ResetQueuedResourceRequest.pb( cloud_tpu.ResetQueuedResourceRequest() ) @@ -13874,6 +13985,7 @@ def test_reset_queued_resource_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = operations_pb2.Operation() + post_with_metadata.return_value = operations_pb2.Operation(), metadata client.reset_queued_resource( request, @@ -13885,6 +13997,7 @@ def test_reset_queued_resource_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_generate_service_identity_rest_bad_request( @@ -13964,10 +14077,13 @@ def test_generate_service_identity_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_generate_service_identity" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_generate_service_identity_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_generate_service_identity" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GenerateServiceIdentityRequest.pb( cloud_tpu.GenerateServiceIdentityRequest() ) @@ -13993,6 +14109,10 @@ def test_generate_service_identity_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.GenerateServiceIdentityResponse() + post_with_metadata.return_value = ( + cloud_tpu.GenerateServiceIdentityResponse(), + metadata, + ) client.generate_service_identity( request, @@ -14004,6 +14124,7 @@ def test_generate_service_identity_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_accelerator_types_rest_bad_request( @@ -14088,10 +14209,13 @@ def test_list_accelerator_types_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_list_accelerator_types" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_list_accelerator_types_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_list_accelerator_types" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.ListAcceleratorTypesRequest.pb( cloud_tpu.ListAcceleratorTypesRequest() ) @@ -14117,6 +14241,10 @@ def test_list_accelerator_types_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.ListAcceleratorTypesResponse() + post_with_metadata.return_value = ( + cloud_tpu.ListAcceleratorTypesResponse(), + metadata, + ) client.list_accelerator_types( request, @@ -14128,6 +14256,7 @@ def test_list_accelerator_types_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_accelerator_type_rest_bad_request( @@ -14216,10 +14345,13 @@ def test_get_accelerator_type_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_get_accelerator_type" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_get_accelerator_type_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_get_accelerator_type" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GetAcceleratorTypeRequest.pb( cloud_tpu.GetAcceleratorTypeRequest() ) @@ -14243,6 +14375,7 @@ def test_get_accelerator_type_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.AcceleratorType() + post_with_metadata.return_value = cloud_tpu.AcceleratorType(), metadata client.get_accelerator_type( request, @@ -14254,6 +14387,7 @@ def test_get_accelerator_type_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_list_runtime_versions_rest_bad_request( @@ -14338,10 +14472,13 @@ def test_list_runtime_versions_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_list_runtime_versions" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_list_runtime_versions_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_list_runtime_versions" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.ListRuntimeVersionsRequest.pb( cloud_tpu.ListRuntimeVersionsRequest() ) @@ -14367,6 +14504,10 @@ def test_list_runtime_versions_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.ListRuntimeVersionsResponse() + post_with_metadata.return_value = ( + cloud_tpu.ListRuntimeVersionsResponse(), + metadata, + ) client.list_runtime_versions( request, @@ -14378,6 +14519,7 @@ def test_list_runtime_versions_rest_interceptors(null_interceptor): pre.assert_called_once() post.assert_called_once() + post_with_metadata.assert_called_once() def test_get_runtime_version_rest_bad_request( @@ -14466,10 +14608,13 @@ def test_get_runtime_version_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_get_runtime_version" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_get_runtime_version_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_get_runtime_version" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GetRuntimeVersionRequest.pb( cloud_tpu.GetRuntimeVersionRequest() ) @@ -14493,6 +14638,7 @@ def test_get_runtime_version_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.RuntimeVersion() + post_with_metadata.return_value = cloud_tpu.RuntimeVersion(), metadata client.get_runtime_version( request, @@ -14504,6 +14650,7 @@ def test_get_runtime_version_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( @@ -14583,10 +14730,13 @@ def test_get_guest_attributes_rest_interceptors(null_interceptor): ) as transcode, mock.patch.object( transports.TpuRestInterceptor, "post_get_guest_attributes" ) as post, mock.patch.object( + transports.TpuRestInterceptor, "post_get_guest_attributes_with_metadata" + ) as post_with_metadata, mock.patch.object( transports.TpuRestInterceptor, "pre_get_guest_attributes" ) as pre: pre.assert_not_called() post.assert_not_called() + post_with_metadata.assert_not_called() pb_message = cloud_tpu.GetGuestAttributesRequest.pb( cloud_tpu.GetGuestAttributesRequest() ) @@ -14612,6 +14762,10 @@ def test_get_guest_attributes_rest_interceptors(null_interceptor): ] pre.return_value = request, metadata post.return_value = cloud_tpu.GetGuestAttributesResponse() + post_with_metadata.return_value = ( + cloud_tpu.GetGuestAttributesResponse(), + metadata, + ) client.get_guest_attributes( request, @@ -14623,6 +14777,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_location_rest_bad_request(request_type=locations_pb2.GetLocationRequest): diff --git a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2alpha1/test_tpu.py b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2alpha1/test_tpu.py index 19fa0c9f8810..4bea1795f334 100644 --- a/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2alpha1/test_tpu.py +++ b/packages/google-cloud-tpu/tests/unit/gapic/tpu_v2alpha1/test_tpu.py @@ -22,6 +22,7 @@ except ImportError: # pragma: NO COVER import mock +import json import math from google.api_core import api_core_version @@ -73,6 +74,13 @@ ) from google.cloud.tpu_v2alpha1.types import cloud_tpu +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 @@ -284,6 +292,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 = TpuClient(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 = TpuClient(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", [